Matlab 如何用中点法同时求解常微分方程?

Matlab 如何用中点法同时求解常微分方程?,matlab,Matlab,这是我的中点函数文件,我也不确定。我编辑了原始的中点函数文件以适应这个问题,但我不知道它是否正确 function [t,a] = midpoint2(dadt,tspan,z0,h) % [t,y] = midpoint2(dydt,tspan,y0,h) % uses midpoint method to solve an ODE % % INPUTS: % - dadt = function handle of the ODE, f(t,a) % - tspan = [<ini


这是我的中点函数文件,我也不确定。我编辑了原始的中点函数文件以适应这个问题,但我不知道它是否正确

function [t,a] = midpoint2(dadt,tspan,z0,h)
% [t,y] = midpoint2(dydt,tspan,y0,h)

% uses midpoint method to solve an ODE
%
% INPUTS:
%  - dadt = function handle of the ODE, f(t,a)
%  - tspan = [<initial value>, <final value>] of independent variable
%  - z0 = initial value of dependent variable
%  - h = step size
% OUTPUTS:
%  - t = vector of time
%  - a = vector of solution for degree

% Input Validation: tspan
if ~(tspan(2)>tspan(1))
    error('upper limit must be greater than lower')
end

% define t vector
t = (tspan(1):h:tspan(2))';
n = length(t);
% if necessary, add an additional t so that range goes up to tspan(2)

% Preallocate a to improve efficiency
a = z0*ones(n,1);
% Implement Midpoint method
for i = 1:n-1
    t_half = a(i)+h/2*dadt(t(i),a(i));
    a(i+1) = a(i)+h*(dadt(t(i)+h/2,t_half));
end
函数[t,a]=中点2(dadt,tspan,z0,h)
%[t,y]=中点2(dydt,tspan,y0,h)
%使用中点法求解ODE
%
%投入:
%-dadt=常微分方程的函数句柄,f(t,a)
%-tspan=[,]的自变量
%-z0=因变量的初始值
%-h=步长
%产出:
%-t=时间向量
%-a=度的解向量
%输入验证:tspan
if~(tspan(2)>tspan(1))
错误('上限必须大于下限')
结束
%定义t向量
t=(tspan(1):h:tspan(2));
n=长度(t);
%如有必要,添加一个额外的t,使范围上升到tspan(2)
%预先分配a以提高效率
a=z0*个(n,1);
%实现中点法
对于i=1:n-1
t_half=a(i)+h/2*dadt(t(i),a(i));
a(i+1)=a(i)+h*(dadt(t(i)+h/2,t_-half));
结束

“我不知道它是否正确。”你可以很容易地检查这一点,选择一个你知道如何求解的方程,看看你的近似值是否接近真解。选择几个不同的微分方程,看看你有解析解,看看你的代码是否给出了相同的答案。另外,将代码的结果与内置函数的结果进行比较,如。还要注意,对于小角度,近似值sin(θ)~theta是有效的。这将导致线性微分方程也有一个封闭形式的解决方案。要检查您的代码是否正常工作,请首先与您知道的一些结果进行比较。