我写了一段代码,用中心差分法在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)
2条答案
按热度按时间yws3nbqq1#
看起来代码中的差异是向后差异而不是中心差异。它使用的点是(i)和(i-1),而对于您的公式,您有(i+1)和(i-1)。点(i+1)和(i-1)是两个点,而不是(i)和(i-1)的一个点,这就是我认为系数差异的来源。
bjp0bcyl2#
我认为数学符号和MATLAB符号的混合引入了错误.
你有正确的重新排列的中心差异:
字符串
您使用变量
i
以h
为步长循环时间增量。每次循环都递增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)
而不是y(i-1)
,因为它是 * 当前 * 时间步长t(i)
的导数。如果正确执行中心差分公式,
h
的系数应该是2。