matlab - 我应该如何在 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
解决方案
问题不在于for
循环,而在于线路
S=solve(eqns,[a,b,c,d,e]);
这需要太长时间来解决方程。
这可能是由于:
- 方程组太复杂,Matlab 的符号工具箱无法处理。
- 您的方程组没有解析解,因此您应该首先考虑尝试使用 Matlab 的 ODE 求解器之一对方程进行数值求解,例如ode45。
推荐阅读
- git - Git 分支过滤选择的文件
- oracle - ORA-02395: 超出了 IO 使用的调用限制并使用游标作为替代
- java - ChipNavigationBar如何初始化java代码
- ionic-framework - Ionic 5 离子载玻片作为“虚拟载玻片”
- fortran - 支持ieee_arithmetic的gfortran/ifort/nagfor/g95第一个版本是什么?
- python - 如何在 PySpark 中为大型数据集使用采样方法?
- node.js - 登录后没有出现任何错误的html文件
- c# - 使用命令行(在开发服务器中)添加对 .net 框架项目的包引用
- javascript - React/Gatsby 中的图表 js
- typescript - TypeScript 中没有浮动承诺检查