Nonlinear simultaneous equation solution with a syms function.
1 回表示 (過去 30 日間)
古いコメントを表示
I try to solve a nonlinear simultaneous equation using the function with 'syms'.
The function created by 'syms' was converted to an anonymous function using 'matlabFunction'
So we tried to solve the nonlinear simultaneous equation using 'fsolve' by making two equations and two variables
But It does not proceed due to an error called 'Nonscalarrays of function hands are not allowed; use cell arrays insted'.
I guess, for example, there are function expressed about syms,
f1 = x^2 + y + 2
f2 = log(x) + y^2
These is changed
f1_ = x(1)^2 + x(2) + 2
f2_ = log(x(1)) + x(2)^2
but I don’t know how to change
If there is a solution, please let me know.
Attached is the code below.
%%%%%%%%%%%%%%%
clear all
%%%%%%%%%%%%% Declaration ofvariables%%%%%%%%%%%%%%
x_s=cell(2,1);
R=8.3146261815324;
H_1=13423;
Tm_1=1356.35;
H_2=17936;
Tm_2=1728.15;
al_1=14259;
bl_1=0.45;
al_2=0;
bl_2=0;
as_1=6877.12;
bs_1=4.6;
as_2=-2450.1;
bs_2=1.87;
syms dG_1 dG_2 T x dG_ex_l dG_ex_s dG_l(x,T) dG_s(x,T) x_ x_0 x_1 x_2
dG_1=H_1*((Tm_1-T)./Tm_1);
dG_2=H_2*((Tm_2-T)./Tm_2);
dG_ex_l=(1-x)*x*(al_1+bl_1*T)+(1-x)*x*(al_2+bl_2*T)*(1-2*x);
dG_ex_s=(1-x)*x*(as_1+bs_1*T)+(1-x)*x*(as_2+bs_2*T)*(1-2*x);
dG_l=x*dG_2+R*T*((1-x)*log(1-x)+x*log(x))+dG_ex_l;
dG_s=-(1-x)*dG_1+R*T*((1-x)*log(1-x)+x*log(x))+dG_ex_s;
T_aaa=1300:10:1800;
Tn=T_aaa(10);
dG_l_const_T=subs(dG_l,[x, T], [x_, Tn]);
dG_s_const_T=subs(dG_s,[x, T], [x_, Tn]);
pre_f=dG_s_const_T-dG_l_const_T;
f=matlabFunction(pre_f);
x_0= fzero(f,[0 1]);%%%%%%%fsolve initial Value
dG_l_f1=subs(dG_l,[x, T], [x_1, Tn]);
dG_s_f1=subs(dG_s,[x, T], [x_2, Tn]);
Diff_dG_l_f1 = diff(dG_l_f1,x_1);
Diff_dG_s_f1 = diff(dG_s_f1,x_2);
%%%%%%%%%%% 1st Function %%%%%%%%%%%%%
pre_f1=Diff_dG_s_f1-Diff_dG_l_f1;
f1=matlabFunction(pre_f1); %%%%%%%% Change x_1 to x_s(1), x_2 to x_s(2)
%%%%%%%%%%% 2nd function °%%%%%%%%%%%%%
pre_f2 = Diff_dG_l_f1*(x_2-x_1)-dG_s_f1+dG_l_f1;
f2=matlabFunction(pre_f2);%%%%%%%% Change x_1 to x_s(1), x_2 to x_s(2)
F1_F2=@(x_1, x_2)[f1;f2]; %%%%%%%%%%%%%%%Change F1_F2=@(x_s)[f1;f2];
x_s = fsolve(F1_F2,x_0);% occur error
0 件のコメント
採用された回答
Walter Roberson
2021 年 11 月 27 日
F1_F2=@(x_1, x_2)[f1(x_1,x_2);f2(x_1,x_2)]; %%%%%%%%%%%%%%%Change F1_F2=@(x_s)[f1;f2];
Or you could have computed:
F1_F2 = matlabFunction([pre_f1; pre_f2]);
without building f1 or f2
その他の回答 (0 件)
参考
カテゴリ
Help Center および File Exchange で Linear Algebra についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!