提问人:int_x 提问时间:10/29/2023 最后编辑:Cris Luengoint_x 更新时间:10/31/2023 访问量:47
中心差分法
Central Difference method
问:
我编写了一段代码,使用中心差分法在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
现在我的问题是,
我们知道,在数学上使用中心差分,
如果我们重新排列,我们得到
y(t+h) ≈ y(t-h)+2h⋅y′(t) 我们代入方程 y' = 3y - 6,我们得到
y(t+h) ≈ y(t-h)+2h⋅(3y-6)
现在比较这个用代码编写的,
y1(i) = y1(i-1) + h*(3*y1(i-1)-6);
为什么我们把 t-h 作为 i-1,为什么 h 的系数取 1?(h的系数必须为2)
答:
看起来代码中的差异是向后差异,而不是中心差异。它使用的点是 (i) 和 (i-1),而对于您的公式,您有 (i+1) 和 (i-1)。(i+1)和(i-1)的点相差两分,而不是(i)和(i-1)的差一分,这就是我认为系数差异的来源。
我认为数学符号和MATLAB符号的混合引入了错误......
您正确地重新排列了中心差:
y(t+h) ≈ y(t-h)+2h⋅y′(t)
您正在使用该变量以大小为步长循环遍历时间增量。每个循环 ,以及相应的值。符号变得混合,因为在您的 MATLAB 代码中,它只是变成了 ,表示下一个时间步,并表示上一个时间步。i
h
t = t(i)
y(t) = y(t(i))
y(i)
y(t+h) = y(i+1)
y(t-h) = y(i-1)
简而言之,数组第 i 个索引处的值对应于数组第 i 个索引处的时间。y
tspan
在代码中,当 时,公式变为y' = 3y - 6
y(i+1) = y(i-1) + 2*h*(3*y(i) - 6);
请注意,导数项不使用,因为它是当前时间步长的导数。y(i)
y(i-1)
t(i)
使用正确实现的中心差公式,系数应为 2。h
评论
上一个:带热源的二维瞬态热传导问题
下一个:生成n_th匿名Walsh函数
评论