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