Matlab 使用;subs";用于评估“输出”的函数;dsolve“的英文缩写;在Maltab中提供额外输出 介绍
如果你想知道大计划。。。阅读介绍。如果没有,请跳到我的问题 我的微分方程和线性代数课程有一个项目,我必须使用计算机代数系统来求解一阶常系数线性微分方程和常系数非线性常微分方程。我必须从分析和数值两方面证明这一点。我的计划是有两个函数,利用分析部分的Matlab 使用;subs";用于评估“输出”的函数;dsolve“的英文缩写;在Maltab中提供额外输出 介绍,matlab,matrix,functional-programming,differential-equations,dsolve,Matlab,Matrix,Functional Programming,Differential Equations,Dsolve,如果你想知道大计划。。。阅读介绍。如果没有,请跳到我的问题 我的微分方程和线性代数课程有一个项目,我必须使用计算机代数系统来求解一阶常系数线性微分方程和常系数非线性常微分方程。我必须从分析和数值两方面证明这一点。我的计划是有两个函数,利用分析部分的dsolve函数和一个名为ODE1的函数,我是通过。该函数用于使用欧拉方法近似求解微分方程。这些函数都将使用相同的输入参数,因此每个输入可以定义一次,并且这些函数都将了解要使用的输入(可能将函数嵌套在一个调用函数下)。目标是在相同的时间间隔内评估分析解
dsolve
函数和一个名为ODE1
的函数,我是通过。该函数用于使用欧拉方法近似求解微分方程。这些函数都将使用相同的输入参数,因此每个输入可以定义一次,并且这些函数都将了解要使用的输入(可能将函数嵌套在一个调用函数下)。目标是在相同的时间间隔内评估分析解,以找到数值近似值,并在表格和图表中比较结果。我得到了一个数值解,给了我一个行向量形式的“表格”,也画出了该行向量。我开始对解析解有疑问
我的问题
为了解一阶线性常微分方程,我生成了这个函数
function [s1] = L_Analytic(eqn,t0,h,numstep,y0)
% eqn is the differential equation to be solved
% t0 is the start of the interval that the resulting equation is to be evaluated at
% h is the stepsize
% numstep is the number of steps
% y0 is the initial condition
syms y(x)
cond = y(0) == y0;
A = dsolve(eqn,cond);
s1 = A;
S1 = s1;
for t = t0 : h : h*(numstep-2)
S1 = [subs(S1); vpa(subs(s1))]
end
end
此函数生成的列表L_分析(diff(y)=y,0,0.1,5,1)
1
1.0
1.105170...
1.221402...
1.349858...
当在Matlab中使用相同输入的不同函数中使用数值方法时,我得到以下列表:
1.0000
1.1000
1.2100
1.3310
1.4641
对于那些熟悉微分方程或精通微积分的人来说,y'=y的解是e^x,当使用5个步骤在0:0.4的区间内进行评估时,列表应为
1
1.105...
1.2214...
1.3498...
1.4918...
四舍五入后
所以这里的问题是,我在分析解决方案中有一个额外的1
。我相信这与subs(S1)
部分S1=[subs(S1);vpa(subs(S1))]
for循环中的subs(S1)
有关,但我很难解决这个问题
我有点理解为什么我需要使用subs
函数,因为我使用符号变量来使用dsolve
函数,该函数在其答案中输出符号变量。此外,为了使for
循环迭代和更改,每次都必须用符号变量替换t
的实际值。我确实尝试将vpa(subs(s1))
移动到for
循环之前,但这只是在向量中返回了相同的值5次。我还试着不使用subs(S1)
,它给了我
exp(t)
1.0
1.1051709...
1.2214027...
1.3498588...
所以我肯定这是代码的一部分
旁注:我理解分析方法输出一个列向量,就像链接的视频中显示的
ODE1
一样。为了让Matlab将其绘制为一条直线,我将列向量转换为行向量,并在解决方案部分固定后对解析解执行相同的操作。通过更改for
循环的内部,我使其工作。我最后的功能代码是:
函数[s1]=L_解析式3(等式n,t0,h,numstep,y0)
%Differential Equation solver for specific inputs
% eqn is the differential equation
% t0 is start of evaluation interval
% h is stepize
% numstep is the number of steps
% y0 is the initial condition
syms y(x)
cond = y(0) == y0;
A = dsolve(eqn, cond);
s1 = A;
S1 = s1;
for x = t0 : h : h*(numstep)
subs(x);
if x == t0
S1 = subs(s1,x);
else
S1 = [subs(S1), subs(s1,vpa(x))];
end
end
end