首页 > 解决方案 > 我应该如何在 MATLAB 中将 syms 与求解命令一起使用?

问题描述

我无法解决这组联立非线性方程来确定未知变量a, b, c, d, e

似乎我的代码进入了无限循环并且永不停止。

syms a b c d e;
K1=zeros(1,5);
K2=zeros(1,5);
K3=zeros(1,5);
K4=zeros(1,5);
K5=zeros(1,5);

for i=1:9
    x1=[0.5096 0.5092 0.5087 0.4852 0.4847 0.4834 0.4804 0.4805 0.4803];
    x2=[0.0963 0.0964 0.0965 0.1163 0.1161 0.1158 0.1275 0.1266 0.1253];
    x3=[0.3941 0.3944 0.3948 0.3985 0.3992 0.4008 0.3921 0.3929 0.3943];   
    
    T=[394.15 399.15 404.15 375.15 390.15 405.15 374.15 392.15 406.15]; 
    
    K1(i)=exp((-8.549)+(6692/T(i)))
    K2(i)=100
    K3(i)=exp((16.93565)+((1250)/T(i))+(-2.575*log(T(i))))
    K4(i)=exp((-936.28)+((40216.27)/T(i))+(151.983*(log(T(i))))+(-0.1675*(T(i))))
    K5(i)=exp((1044.78)+(-45171.42/T(i))+(-165.20*log(T(i)))+(0.1511*(T(i))))
    
    eqns=[((d*(c-e))/((x1(i)-a-b-c-d)^5)*(x2(i)-d-b-c))==K1(i),...
       ((a+b+c)*a)/((x1(i)-a-b-c-d)^2)==K2(i),...
       ((a+b+c)*(d+b))/((x1(i)-a-b-c-d)*(x2(i)-d-b-c-e))==K3(i),...
       ((a+b+c)*(c-e))/((x1(i)-a-b-c-d)^4*(x2(i)-d-b-c-e))==K4(i),...
       (((e)*(x1(i)-a-b-c-d)^3)/((c-e)*(x3(i)-e)))==K5(i)];

    S=solve(eqns,[a,b,c,d,e]);
    S.a(S.a<0)=[];
    S.b(S.b<0)=[];
    S.c(S.c<0)=[];
    S.d(S.d<0)=[];
    S.e(S.e<0)=[];
    S.a=double(S.a)
    S.b=double(S.b)
    S.c=double(S.c)
    S.d=double(S.d)
    S.e=double(S.e)
end

标签: matlabvariablessymbolic-mathnonlinear-equation

解决方案


问题不在于for循环,而在于线路

S=solve(eqns,[a,b,c,d,e]);

这需要太长时间来解决方程。

这可能是由于:

  1. 方程组太复杂,Matlab 的符号工具箱无法处理。
  2. 您的方程组没有解析解,因此您应该首先考虑尝试使用 Matlab 的 ODE 求解器之一对方程进行数值求解,例如ode45

推荐阅读