matlab 中心差分法

rsaldnfx  于 6个月前  发布在  Matlab
关注(0)|答案(2)|浏览(98)

我写了一段代码,用中心差分法在MATLAB中求解一个常微分方程。脚本文件是

clc;
clear;
close all;
% Step size and paramteres
h = 0.0001;
tspan = 0:h:10;
initial_condition = 3;

% ode45 solver
[t,y] = ode45(@central_diff_f1,tspan,initial_condition);
plot(t,y);

% using the central difference
[t1,y1] = central_diff_f2(tspan,initial_condition,h);
hold on
plot(t1,y1)
legend('ODE 45','Central-Difference');

字符串
在这里,我试图覆盖的解决方案我的函数文件如下,

function [t1,y1] = central_diff_f2(tspan,initial_condition,h)

y1 = zeros(size(tspan));
y1(1) = initial_condition;
t1 = tspan;
% implementing central difference approximation
for i=2:1:length(tspan)
    y1(i) = y1(i-1) + h*(3*y1(i-1)-6);
end


我的问题是,
我们知道用数学上的中心差
x1c 0d1x的数据
如果我们重新安排,
y(t+h)y(t-h)+2h y ′(t)
我们代入方程y' = 3 y- 6,我们得到
y(t+h)y(t-h)+2h(3y-6)
现在比较一下这个用代码写的,
第一个月
为什么我们把t-h取为i-1,为什么h的系数取为1?(h的系数必须为2)

yws3nbqq

yws3nbqq1#

看起来代码中的差异是向后差异而不是中心差异。它使用的点是(i)和(i-1),而对于您的公式,您有(i+1)和(i-1)。点(i+1)和(i-1)是两个点,而不是(i)和(i-1)的一个点,这就是我认为系数差异的来源。

bjp0bcyl

bjp0bcyl2#

我认为数学符号和MATLAB符号的混合引入了错误.
你有正确的重新排列的中心差异:

y(t+h) ≈ y(t-h)+2h⋅y′(t)

字符串
您使用变量ih为步长循环时间增量。每次循环都递增t = t(i)和相应的y(t) = y(t(i))值。符号变得混合,因为在MATLAB代码中,这只是成为y(i)y(t+h) = y(i+1)表示下一个时间步长,y(t-h) = y(i-1)表示上一个时间步长。
简而言之,数组y的第i个索引处的值对应于数组tspan的第i个索引处的时间。
在代码中,当y' = 3y - 6时,公式变为

y(i+1) = y(i-1) + 2*h*(3*y(i) - 6);


注意,导数项使用y(i)而不是y(i-1),因为它是 * 当前 * 时间步长t(i)的导数。
如果正确执行中心差分公式,h的系数应该是2。

相关问题