필터 지우기
필터 지우기

fsolve in codegen returns indexing error

조회 수: 1 (최근 30일)
Max Bartholdt
Max Bartholdt 2020년 11월 18일
댓글: Max Bartholdt 2020년 11월 20일
Hello,
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.
Many Regards,
Max
  댓글 수: 3
Mukund Sankaran
Mukund Sankaran 2020년 11월 18일
Hi Max. Would it be possible for you to share the code for myeq ?
Max Bartholdt
Max Bartholdt 2020년 11월 19일
편집: Max Bartholdt 2020년 11월 19일
function x = myeq(u)
x = zeros(1,1);
u1 = u(1);
% u2 = u(2);
x(1) = (u1^2-u1)-3;
% x(2) = u2*u1+2;
end

댓글을 달려면 로그인하십시오.

채택된 답변

Caleb Magruder
Caleb Magruder 2020년 11월 19일
Hi Max,
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
  댓글 수: 1
Max Bartholdt
Max Bartholdt 2020년 11월 20일
Hello Caleb,
Thank you for your quick answer and the suggestion for a workaround.
Many Regards,
Max

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Solver Outputs and Iterative Display에 대해 자세히 알아보기

제품


릴리스

R2020b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by