当使用matlab的ode45函数时,ODE之间是否存在固有的交互作用?

当使用matlab的ode45函数时,ODE之间是否存在固有的交互作用?,matlab,ode,interaction,Matlab,Ode,Interaction,我试图使用Matlab的ODE45函数在两个块中模拟种群之间的相互作用扩散。 每个区块中的总体由相同的常微分方程组控制,但初始条件不同 然而,我发现,即使两个区块之间没有相互作用项,因此它们应该是独立的,初始条件的差异似乎仍然会影响其中的种群。这意味着,当一起计算时,块中的总体与单独计算时不同。对此有何解释 我用一个非常简单的模型来验证概念: 函数调用: [t1,y1] = ode45(@equations, [1:20], [100; 50]); % block 1 [t2,y2] = ode

我试图使用Matlab的ODE45函数在两个块中模拟种群之间的相互作用扩散。 每个区块中的总体由相同的常微分方程组控制,但初始条件不同

然而,我发现,即使两个区块之间没有相互作用项,因此它们应该是独立的,初始条件的差异似乎仍然会影响其中的种群。这意味着,当一起计算时,块中的总体与单独计算时不同。对此有何解释

我用一个非常简单的模型来验证概念:

函数调用:

[t1,y1] = ode45(@equations, [1:20], [100; 50]); % block 1
[t2,y2] = ode45(@equations, [1:20], [100; 100]); % block 2
[t3,y3] = ode45(@equations2, [1:20], [100;50;100;100]); % (block 1, block 2)
仅在一个区块中对总体进行功能建模:

function [dydt] = equations(t,y)

dydt = [(y(1) + 5*y(2)); ... %m
        (-y(2) - 2*y(1)); ... %n
       ];
return
对两个模块进行功能建模,但不进行交互:

function [dydt] = equations2(t,y)

dydt = [(y(1) + 5*y(2)); ... %m, block 1
       (-y(2) - 2*y(1)); ... %n, block 1

       (y(3) + 5*y(4)); ... %m, block 2
       (-y(4) - 2*y(3)); ... %n, block 2
       ];
return
分别计算两个块时的结果:

 100                50                  100                 100
-82.5651126482403   -61.2399111160678   -70.8298703784238   -113.079426303262
63.5149326478799    71.2611808361777    40.2624466444427    123.919353592460
-43.1859556122909   -79.8393860152817   -8.90683490348150   -132.277927048621
21.9743397563556    86.8220697463693    -22.6303780909040   137.973908367664
-0.354918519359671  -92.0989416214417   53.7225657700143    -140.919984325956
-21.2629138588043   95.5352361959004    -83.7315196717762   141.098469411677
42.4644938860107    -97.0482785784471   112.050303306456    -138.445708319198
-62.8212058809813   96.6327114704933    -138.138533695681   133.012881410501
81.9247177241794    -94.3111553111835   161.481224015549    -124.963465578347
-99.3812030807478   90.1082810663461    -181.603255611880   114.429891038409
114.845927928453    -84.0902243542573   198.088587603452    -101.593579579227
-128.038489201868   76.4154884940680    -210.635351405432   86.7397437298800
138.675067137440    -67.2257825991193   219.018298709806    -70.1774427449607
-146.535410253369   56.6883955999672    -223.021403427644   52.2241854879404
151.485921591776    -45.0236010893207   222.530966569364    -33.2118012943491
-153.442292768067   32.4726456791801    -217.644899082991   13.5504349990489
152.321501615162    -19.2743265017041   208.457113276080    6.36250787673260
-148.144949801383   5.68381588482233    -195.066043293572   -26.1560882959426
141.024940766196    8.01698112966525    177.792461039602    45.4369626814643
两个块同时计算时的结果:

100                 50                  100                 100
-82.5614380549815   -61.2386250164727   -70.8214933555803   -113.085294273425
63.4808523920134    71.2492107022344    40.2403909177619    123.906052225068
-43.1428254169980   -79.8465560431243   -8.86332933780633   -132.269515222896
21.9512910424390    86.8494877098212    -22.6803808332093   137.993637919124
-0.324547757386938  -92.1128384145929   53.7640196166716    -140.954822929939
-21.3110352832942   95.5328877966081    -83.7748031881502   141.094761269331
42.5230708505071    -97.0466778715188   112.116137495667    -138.418902426909
-62.8798722752104   96.6307163280550    -138.215550196187   132.992890319329
81.9803719854667    -94.2947890971016   161.559769097134    -124.926060504869
-99.4446392159052   90.0812551138450    -181.682036111080   114.372592711550
114.920836766971    -84.0716375263694   198.174987302179    -101.539954624572
-128.100385825296   76.3847285271368    -210.709163142815   86.6824352002572
138.720481894513    -67.1710769635203   219.033021842029    -70.0921219690280
-146.574502140440   56.6199063635580    -222.990477101486   52.1070327582791
151.516503440925    -44.9493339209586   222.520965582938    -33.0950981283072
-153.445319072891   32.3873778023315    -217.627693978053   13.4288556805328
152.307662312383    -19.1817679777499   208.387426508819    6.50027540164903
-148.121448302555   5.59183915228772    -194.975897304652   -26.2998808971022
140.970297553726    8.11485856302741    177.658703561865    45.5804419325655

结果有多大不同?Ode45是一种步长控制方法。用于控制步长的局部误差的计算肯定会有所不同,但对于关节系统来说未必更好或更差。但是,产生的值差异应保持在方法中使用的相对和绝对公差范围内,默认情况下为1e-6。使用较小的公差应将两个系统解耦到相应的程度

PS:直到最后显示的数字发生变化,正确的结果应为

 1 [ 100.           50.          100.          100.        ]
 2 [ -82.53524872  -61.2596255   -70.77524805 -113.11125047]
 3 [  63.41855387   71.29313918   40.13392902  123.95857849]
 4 [ -43.03253624  -79.8997202    -8.68932914 -132.32487471]
 5 [  21.7852221    86.90710777  -22.92918773  138.04268767]
 6 [  -0.101876596 -92.1750490    54.0887768  -140.997575  ]
 7 [ -21.58350797   95.59810598  -84.16577854  141.1303955 ]
 8 [  42.83689848  -97.10776622  112.55820169 -138.43848988]
 9 [ -63.23290817   96.67381387 -138.69777167  132.97573693]
10 [  82.36331078  -94.30493447  162.06130481 -124.85147371]
11 [ -99.84521116   90.04854117 -182.18117983  114.2283074 ]
12 [ 115.32870896  -83.9898257   198.6546973  -101.31886073]
13 [-128.50390187   76.2500533  -211.15213965   86.38151638]
14 [ 139.1070883   -66.98413557  219.42337049  -69.71524539]
15 [-146.92604542   56.37752991 -223.30284108   51.65362329]
16 [ 151.80427675  -44.6425276   222.71290379  -32.55815357]
17 [-153.64414443   32.0140048  -217.66536621   12.81103218]
18 [ 152.40882353  -18.74472148  208.26125485    7.1925021 ]
19 [-148.12303898    5.10026242 -194.68879305  -27.05207841]
20 [ 140.87257081    8.64627842  177.21963374   46.37020718]

您的两次跑步在第一行中已经存在不可接受的差异。

请同时发布三次跑步的结果。差异不大,但肯定大于1e-6。有趣的是,当两个块的初始条件相同时,即100;50;100;50,结果与单独计算时完全相同,这让我想知道是否内置了某种形式的交互。您是否可以尝试通过ode45方法的选项将公差设置为较小的值,如1e-10,并观察行为是否发生变化?我将绝对和相对误差公差设置为1e-10,这个问题看起来仍然存在——只有最后几个小数位随着公差的变化而变化;你能解释一下你是如何发现这些值的吗?我是否错误地实现了ode45?@anna:使用具有固定步长的RK4,并检查小数在步长的h、h/2、h/4范围内是否保持有效。-我真的看不出有什么matlab可以用来测试问题是什么,您的命令很简单,对于sin3*t和cos3*t的组合结果,ODE45应该更精确。也许您可以将代码减少到绝对必要的最小值,去掉后面的分号,使用end-of或additional-to-return结束函数。