MATLAB中ODE解的导数值错误



试图用本文中描述的经典Runge-Kutta方法解决非线性常微分方程的Cauchy问题(请参见ode4(。运行此部件后

q = 10;
T = 5;
N = @(g1, g2) g1^2 + sin(g2);
t = linspace(0, T, q);
GCC = nonlinearGreenCC(N, 1, T);
di = diff(GCC);

对CCD_ 2和CCD_。而GCC(1) = 0如预期,di(1) = 1.6e-05。不明白为什么,因为一阶导数的柯西条件是1。如何纠正错误?非常感谢您的帮助。

函数nonlinearGreenCC如下:

function G = nonlinearGreenCC(N, a0, T)
h = .0001;
eqGreen = @(t, g)[g(2); - N(g(1), g(2))];
Cc = [0, a0];
G = ode4(eqGreen, 0, h, T, Cc);
end

GCC是一个值对数组,从与等更精确的集成开始

[  0.00000000e+00,   1.00000000e+00],
[  9.99957927e-05,   9.99915855e-01],
[  1.99983171e-04,   9.99831715e-01],
[  2.99962136e-04,   9.99747579e-01],
[  3.99932687e-04,   9.99663448e-01],

对于确切的值,但使用ode4函数的结果以类似的东西开始

0                         1
1.66652642851402e-05      1.00001666526429
-1.40231141152723e-05      0.999985976885885
1.66638620438405e-05      1.00001666386204
-1.40217119017434e-05      0.999985978288098

它不包含时间间隔的采样,实际上在您称为diff的级别上,h的值是未知的。diff不可能计算出你所期望的差商。如果你阅读了文档,你会发现它只计算了差异。并且第一差值仅返回第一值CCD_ 12。


导致ode4算法产生奇怪结果的直接错误是eqGreen在应该返回行向量的地方产生列向量。由于初始值是一个行向量,ode4中行向量和列向量相加的结果产生了一个2x2矩阵,该矩阵作为2行添加到结果中,结果令人困惑。具有两个行向量将结果放入具有交替值和导数的一行中。更改为

eqGreen = @(t, g)[g(2), - N(g(1), g(2))];
Cc = [0, a0];

结果是

GCC(1:5,:) =
0                     1
9.99957927208439e-05     0.999915855174488
0.000199983171186392     0.999831714893813
0.000299962135851046     0.999747579156327
0.000399932687169042     0.999663447960381
di(1:5,:)=
9.99957927208439e-05  -8.41448255122224e-05
9.99873784655483e-05  -8.41402806746050e-05
9.99789646646540e-05  -8.41357374861129e-05
9.99705513179961e-05  -8.41311959463020e-05
9.99621384254097e-05  -8.41266560547282e-05

如果你用h=1e-4除以最后一个,你就会得到预期的结果。

相关内容

  • 没有找到相关文章

最新更新