lsqnonlin with vector input and multiple equations.

조회 수: 3 (최근 30일)
Emma Van Puyenbroeck
Emma Van Puyenbroeck 2020년 2월 21일
답변: Pravin Jagtap 2020년 2월 24일
when I try to run my model I always receive the error 'Undefined function or variable 'x'.'
How should I specify my variable x?
function y=testst(T_1,T_2,P_c,Q_gen)
x_1=0.35
x_2=0.21
y_3=0.85
h_1=1500
h_2=500
h_3=230
f(1)=x(1)-x(2)-x(3);
f(2)=x_1*x(1)-x_2*x(2)-y_3*x(3);
f(3)=Q_gen+x(1)*h_1-x(2)*h_2-x(3)*h_3;
steadystate=@(x) f(x);
st=[0.005 ;0.005; 0.005]';
lb=[0; 0 ;0];
ub=[1 ;1 ;1];
x=lsqnonlin('steadystate',st,lb,ub)
y=x
end
I also tried this:
st=[0.005 ;0.005;0.005];
lb=[0; 0 ;0];
ub=[1 ;1;1];
y=lsqnonlin(@(x) steadystate(x,x_1,y_3,h_1,h_2,h_3,Q_gen),st,lb,ub);
function f= steadystate(x,x_1,x_2,y_3,h_1,h_2,h_3,Q_gen)
f(1)=x(1)-x(2)-x(3);
f(2)=x_1*x(1)-x_2*x(2)-y_3*x(3);
f(3)=Q_gen+x(1)*h_1-x(2)*h_2-x(3)*h_3;
end
but than I had 'not enough input arguments'

답변 (1개)

Pravin Jagtap
Pravin Jagtap 2020년 2월 24일
Hello Emma,
The error mentioned is caused because of the way 'function handle' is used (steadystate=@(x) f(x);). In your case, it is better to write the separate function which returns 'f(1)', 'f(2)' and f(3) values. Please refer to the following example for creating the function handle:
function f = get_f(x)
f(1) = x(1);
f(2) = x(2);
f(3) = x(3);
end
Then, run the following script to see how to create the function handle:
f = @get_f;
x = [1 2 3];
steadystate = f(x)
Here, ‘steadystate’ will be 1x3 vector. Modify your code using above reference and for more details on how to use function handles use the following documentation link:

Community Treasure Hunt

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

Start Hunting!

Translated by