Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB中常微分方程解的导数取值错误_Matlab_Ode_Differential Equations_Derivative - Fatal编程技术网

MATLAB中常微分方程解的导数取值错误

MATLAB中常微分方程解的导数取值错误,matlab,ode,differential-equations,derivative,Matlab,Ode,Differential Equations,Derivative,尝试使用中描述的经典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); 我评估GCC(1)和di(1)。当GCC(1)=0符合预期时,di(1)=1.6e-05。我不明白为什么,因为一阶导数的柯西条件是1。如何纠正不

尝试使用中描述的经典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);
我评估
GCC(1)
di(1)
。当GCC(1)=0符合预期时,
di(1)=1.6e-05
。我不明白为什么,因为一阶导数的柯西条件是1。如何纠正不准确/错误?非常感谢您的帮助

函数
非线性绿色CC
如下所示:

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],
 0                         1
 1.66652642851402e-05      1.00001666526429
-1.40231141152723e-05      0.999985976885885
 1.66638620438405e-05      1.00001666386204
-1.40217119017434e-05      0.999985978288098
对于精确的值,但是使用
ode4
函数的结果以如下开头

[  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],
 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
无法计算出您似乎期望的差商。如果您阅读了文档,您会发现它只计算了差异。第一个差分只返回第一个值
1.66652642851402e-05


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

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来缩放最后一个,你会得到预期的结果。

这很清楚。谢谢你的回答。现在,让我困惑的是为什么
GCC
有两列,第二列是什么意思?另一件事是当define
eps=.0001
eqGreen=@(t,g)[g(2),-N(g(1),g(2))+a0*1/(eps*pi)*exp(-t^2/eps^2)]
Cc=[0,0]然后
di(1)=0.1357
。然而,
di(1)
只是在
t=0时计算的溶液的一阶导数,对吗?然后,它应该返回
0
。这一点也不清楚。
GCC
有两列,因为2阶ODE的一阶系统有一个二维状态空间。这就是为什么
eqGreen
函数返回一个包含两个分量的向量。状态向量
g
的第一个分量是函数值,第二个分量是一阶导数。返回值的导数阶数增加了1。修改后的系统很僵硬。不管它是否具有正确的理论行为,为了正确捕捉您需要的脉搏
h/eps谢谢您的解释,现在一切都清楚了。我回到了最初的系统,它并不僵硬。我将把
GCC
的列存储到两个不同的向量中。希望这有助于实现我的目标。最好先试试
eps=1e-3
。高斯脉冲的分母中只有
pi^0.5
。你的积分只会超过一半的脉冲,因此正确到
..+a0*2/(eps*pi^0.5)*exp(-t^2/eps^2)
。然后导数列接近
1
,从
t=2e-3
开始。