作为小组项目的一部分,我们有一个由2个非线性微分方程组成的系统,我们必须使用中点法绘制S = S(t),I = I(t)图形。
当我尝试使用相应的微分方程插入矩阵时,我得到以下错误:
“内联表达式错误==>矩阵([[ - (I S)/ 1000],[(I S)/ 1000 - (3 * I)/ 10]]) 未定义的函数'matrix'用于'double'类型的输入参数。
inline / subsref错误(第23行) INLINE_OUT_ = inlineeval(INLINE_INPUTS_,INLINE_OBJ_.inputExpr,INLINE_OBJ_.expr);“
我所做的代码如下:
syms I S
u=[S;I];
F=[-0.001*S*I;0.001*S*I-0.3*I];
F1=inline(char(F),'I','S');
h=100; %Valores aleatórios
T=100000;
ni=(T/h);
u0=[799;1];
f=zeros(1,2);
k=zeros(1,2);
i=1;
while i<=ni
f(1)=F1(u0(1));
f(2)=F1(u0(2));
dx=h*f;
k(1)=F1((u0(1)+h*(1/2)),(u0(2)+h*(1/2)));
k(2)=F1((u0(1)+h*(1/2)),(u0(2)+h*(1/2)));
u1=u0+h*k;
disp('i:'),disp(i)
disp('u= '),disp(u1)
u0=u1;
i=i+1;
end
我是新手,所以这个算法很可能是错误的,但是如果有人可以帮助我解决这个错误,我会对它进行预测。谢谢!
答案 0 :(得分:0)
专门创建错误的问题是你将两个符号函数放入矩阵然后调用char
(输出matrix([[-(IS)/1000], [(IS)/1000 - (3*I)/10]])
而不是很好地转换为字符串)。
第二个问题是你试图将两个函数同时传递给inline
。 inline
从字符串创建单个函数(无论如何都使用匿名函数而不是inline
)。你不能在其中加入多个功能。
此处您不需要sym
。事实上,如果你根本不需要操纵方程式,那就避免它(比它的价值更麻烦)。一种常见的方法是创建一个单元格数组:
F{1} = @(I,S) -0.001*S*I;
F{2} = @(I,S) 0.001*S*I-0.3*I;
然后您可以传递I
和S
:
F{1}(500,500)
请注意,您的所有功能都包含I
和S
,因此它们始终是必需的。重新考虑在传递这样一个变量时所期望的内容:f(1)=F1(u0(1));
,因为这也会产生错误。