fsolve in codegen returns indexing error

Illustration
Nicholas - 2020-12-07T11:19:39+00:00
Question: fsolve in codegen returns indexing error

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.

Expert Answer

Profile picture of Prashant Kumar Prashant Kumar answered . 2025-11-20

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


Not satisfied with the answer ?? ASK NOW

Get a Free Consultation or a Sample Assignment Review!