syms 함수로 매트랩 비선형 연립방정식 해결방법

조회수 1284회

syms를 이용하여 함수를 만들고 그 함수를 이용하여

비선형 연립방정식을 해결 하려고 합니다.

syms로 만든 함수는 matlabFunction을 이용하여 익명함수로 전환 하여

두개의 식과 두개의 변수를 만들어서 fsolve를 이용하여 비선형 연립방정식을 해결하려고 했으나

'함수 핸들로 구성된 비스칼라 배열은 허용되지 않습니다. 대신 셀형 배열을 사용하십시오.' 라는 에러로 인해 진행되지 않습니다.

syms로 표현된 함수

f1 = x2 + y + 2

f2 = log(x) + y2

과 같은 함수를

f1_ = x(1)2 + x(2) + 2

f2_ = log(x(1)) + x(2)2

형태로 바꿔야 할꺼 같은데 해결방법이 있다면 알려주시기 바랍니다.

아래 코드 첨부합니다.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear all

%%%%%%%%변수 선언%%%%%%%%%

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 초기값 계산   


  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);

  %%%%%%%%%%% 연립방정식 수식 둘중 첫번쨰%%%%%%%%%%%%%

  pre_f1=Diff_dG_s_f1-Diff_dG_l_f1; 

  f1=matlabFunction(pre_f1);  %%%%%%%% x_1을 x_s(1)로 x_2를 x_s(2)로 바꿔야함

 %%%%%%%%%%% 연립방정식 수식 둘중 두번째%%%%%%%%%%%%%

 pre_f2 = Diff_dG_l_f1*(x_2-x_1)-dG_s_f1+dG_l_f1; 
 f2=matlabFunction(pre_f2);%%%%%%%% x_1을 x_s(1)로 x_2를 x_s(2)로 바꿔야함


 F1_F2=@(x_1, x_2)[f1;f2];

 x_s = fsolve(F1_F2,x_0);% occur error 
  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • F1_F2_s = @(x_s) F1_F2(x_s(1),x_s(2));

    위 코드를 추가하여 해결 하였습니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)