Question
I am struggling with the code generation of a function containing the fsolve command (supported since R2020b). Since it is a rather new topic, I did not find any related entries. This is the function i try to generate the mex-file for: function [x] = test_function(a,b) %#codegen x = zeros(1); opts = optimoptions('fsolve','Algorithm','levenberg-marquardt','Display','off'); % opts = optimoptions(opts,a.string,a.val); fcn = @(in)feval(b,in); rng default x0 = double(0.00);x(1) = fsolve(fcn,x0,opts); end And this is how I setup the code generation: cfg = coder.config('mex'); types = coder.getArgTypes('mytest','test_function') codegen -config cfg -args types test_function With the following function to get the coder.Types: function out = mytest a.val = 10e-5; a.string = "FunctionTolerance"; b = 'myeq'; out = test_function(a,b); end The struct a has no purpose yet, but will later be used to setup the optimoptions. Error Message after calling the codegen: "??? Index expression out of bounds. Attempted to access element 1. The valid range is 1-0." In the Coder Report Viewer it sais, that the error occured in function projectBox. I would appreciate any thoughts on this.
Related Questions
Expert Answer
Prashant Kumar
PhD Expert
Answered Aug 11, 2026
Unfortunately, this is due to a bug which will be fixed in an upcoming software update.
In the meantime, you can work around the issue by calling lsqnonlin instead of fsolve and pass -Inf as a lower bound and Inf as an upper bound, effectively making the problem unbounded. You will also need to update the optimoptions solver from 'fsolve' to 'lsqnonlin' in line 4 of test_function. The updated test_function is below for your reference.
We apologize for the inconvenience this has caused and appreciate you bringing it to our attention.
function [x] = test_function(a,b)
%#codegen
x = zeros(1);
opts = optimoptions('lsqnonlin','Algorithm','levenberg-marquardt','Display','off');
% opts = optimoptions(opts,a.string,a.val);
fcn = @(in)feval(b,in);
rng default
x0 = double(0.00);x(1) = lsqnonlin(fcn,x0,-Inf,Inf,opts);
end
Have a different question? Ask here