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
Matlab:ode45和四阶龙格-库塔方法产生不同的值_Matlab_Math_Ode45 - Fatal编程技术网

Matlab:ode45和四阶龙格-库塔方法产生不同的值

Matlab:ode45和四阶龙格-库塔方法产生不同的值,matlab,math,ode45,Matlab,Math,Ode45,我试图在Matlab中对Kuramoto振荡进行建模。我试着用ode45来解决这个系统。我还看到其他人使用龙格库塔方法。我知道ode45使用Runge-kutta方法,但是,我从每个方法中获得的值都有可疑的不同 kuramoto= @(x,K,N,Omega)Omega+(K/N)*sum(sin(x*ones(1,N)-(ones(N,1)*x')))' %Kuramoto is a model of N coupled ocilators (such as multiple radiowav

我试图在Matlab中对Kuramoto振荡进行建模。我试着用ode45来解决这个系统。我还看到其他人使用龙格库塔方法。我知道ode45使用Runge-kutta方法,但是,我从每个方法中获得的值都有可疑的不同

kuramoto= @(x,K,N,Omega)Omega+(K/N)*sum(sin(x*ones(1,N)-(ones(N,1)*x')))'
%Kuramoto is a model of N coupled ocilators (such as multiple radiowaves)
%The solution to the model is the phase of each ocilator
%[Kuramoto Equation][1]

theta(:,1) = 2*pi*randn(N,1);
t0 = theta(:,1);
[t,y] = ode45(@(t,y)kuramoto(theta(:,1),K,N,omega),tspan,t0);

%Runge-Kutta method
for j=1:iter
k1=kuramoto(theta(:,j),K,N,omega);
k2=kuramoto(theta(:,j)+0.5*h*k1,K,N,omega);
k3=kuramoto(theta(:,j)+0.5*h*k2,K,N,omega);           
k4=kuramoto(theta(:,j)+h*k3,K,N,omega);
theta(:, j+1)=theta(:,j)+(h/6)*(k1+2*k2+2*k3+k4);
end
这两种方法都输出一个矩阵,其中有N行(每行表示不同的振荡器)和M列(其中M表示给定时间的解),我已经以0.1的间隔提供了0到0.5的解。为了比较这些方法,我将从Runge Kutta得到的矩阵减去使用ode45得到的矩阵。理想情况下,两者应具有相同的值,结果应为zeor矩阵,但我得到的值如下:

0   -0.0003   -0.0012   -0.0027   -0.0048   -0.0076
0    0.0003    0.0012    0.0027    0.0048    0.0076
%here I have only two oscillators from t = [0.0,0.5] 
这两个矩阵之间有一个很小的差异(以较大的时间间隔增长)。但不寻常的是,每次(即每列)计算的总值是相同的。这与振荡器的数量无关


我不确定这是一个数学问题还是一个编程问题(可能两者都有),我想我打错电话给ode45了,但我不确定,几天来都没能找出问题所在。任何帮助都将不胜感激。

您应该使用ode45输出。如果您选择的步长太大,那么实现的Runge Kutta最终将变得不稳定。ode45的全部要点是,它在内部运行Runge-Kutta 4和Runge-Kutta 5方案。如果一个积分步骤的结果不同,则ode45将减少时间步骤,直到结果具有可比性。像您这样使用原始方法显然无法做到这一点

从技术上讲,像ode45这样的方法被称为“嵌入式Runge-Kutta”方法。这里有一种方法: 它们是有效的,因为不同阶的龙格-库塔方法重用了许多相同的函数求值


尽管如此,你应该发现如果你减少足够多的时间步长,结果几乎是一样的。它们不同的唯一原因是,当ode45检测到解决方案可能不准确时,它正在内部细化时间步长

您应该使用ode45输出。如果您选择的步长太大,那么实现的Runge Kutta最终将变得不稳定。ode45的全部要点是,它在内部运行Runge-Kutta 4和Runge-Kutta 5方案。如果一个积分步骤的结果不同,则ode45将减少时间步骤,直到结果具有可比性。像您这样使用原始方法显然无法做到这一点

从技术上讲,像ode45这样的方法被称为“嵌入式Runge-Kutta”方法。这里有一种方法: 它们是有效的,因为不同阶的龙格-库塔方法重用了许多相同的函数求值


尽管如此,你应该发现如果你减少足够多的时间步长,结果几乎是一样的。它们不同的唯一原因是,当ode45检测到解决方案可能不准确时,它正在内部细化时间步长

你真的用这条线了吗

[t,y] = ode45(@(t,y)kuramoto(theta(:,1),K,N,omega),tspan,t0);
在您的运行代码中?那么这里的结果肯定是错误的。使用

[t,y] = ode45(@(t,u)kuramoto(u,K,N,omega),tspan,t0);
以获得至少与RK4积分相关的结果。也就是说,在计算匿名函数的值时使用声明的局部变量/参数。(使用
u
而不是
y
theta
不重用在更全局范围内使用的变量名。如果需要自记录变量名,可以使用
thetalocal



PS:差和为零是因为导数向量和为零,因此状态向量上的和是常数,而不管在应用方法时犯了什么错误。所以,如果你从它自身减去相同的常数,你会再次得到零。如果状态向量只有2个元素,那么差分向量的元素就必须是相反的。

您实际使用了该行吗

[t,y] = ode45(@(t,y)kuramoto(theta(:,1),K,N,omega),tspan,t0);
在您的运行代码中?那么这里的结果肯定是错误的。使用

[t,y] = ode45(@(t,u)kuramoto(u,K,N,omega),tspan,t0);
以获得至少与RK4积分相关的结果。也就是说,在计算匿名函数的值时使用声明的局部变量/参数。(使用
u
而不是
y
theta
不重用在更全局范围内使用的变量名。如果需要自记录变量名,可以使用
thetalocal



PS:差和为零是因为导数向量和为零,因此状态向量上的和是常数,而不管在应用方法时犯了什么错误。所以,如果你从它自身减去相同的常数,你会再次得到零。如果状态向量只有2个元素,因此,差分向量的元素必须是相反的。

也许这是密切相关的:不完全是因为我在两种方法之间得到了显著不同的值。也许这是密切相关的:不完全是因为我在两种方法之间得到了显著不同的值。但是,这能解释为什么差异总是总和吗到0?从这个问题上看,我不清楚你想表达什么观点。您将显示两行输出。这些值是连续出现的吗?同样,如果你怀疑有错误,我要做的第一件事就是用这两种方法画出响应图。他们有实质性的不同吗?对不起,我对你的模型一无所知。你说两个不同的振荡器是什么意思?你的意思是你用不同的模型运行了两次ode45吗?龙格-库塔方法返回了什么值?但是,这能解释为什么差异总是等于0吗?从这个问题上我不清楚你想表达什么观点。您将显示两行输出。是吗