Matlab ODE解决方案提供了不正确的解决方案

时间:2019-08-28 02:45:31

标签: matlab ode

在处理Matlab的ode求解器时,我非常头痛。很少有人(如果有的话)想在Matlab论坛上为我提供帮助,因为这是一个长期存在的问题,在过去的四个月中我没有找到解决方案,也没有错误消息可以提供。本质上,我只是想使用Matlab的ode求解器来求解Lorentz力微分方程。然而,令人奇怪的是,即使颂歌求解器为我提供的解决方案是错误的,也不会向我抛出任何错误。根据我的初始条件,我知道特定的解决方案应该是什么样的。要么,要么OR求解器完全忽略方程的一半(再次不抛出错误),并简单地求解另一半,就好像这是那里唯一的东西一样。太奇怪了,因为没有错误消息,所以很难弄清楚。

以下是来自y系统的文件,其中脚本未在我的一端运行:

“ diffiqtest.m”

v0 = [0 0 0];
p0 = [0 0 0];
s0 = [v0 p0];
tspan = [0 5];

[t,S] = ode15s(@reffun,tspan,s0);

“ reffun.m”

function refsolve = reffun(t,s)

Ex = 0;
Ey = 0;
Ez = 0;

persistent Bx By Bz
%Used so that the B-field function is only run once
if isempty(Bx)
    [Bx, By, Bz] = B_test();
end

%Reference: s(1) = vx, s(2) = vy, s(3) = vz, s(4) = x, s(5) = y, s(6) = z
ode1 = Ex + s(2).*Bz(s(4),s(5),s(6)) - s(3).*By(s(4),s(5),s(6));
ode2 = Ey + s(3).*Bx(s(4),s(5),s(6)) - s(1).*Bz(s(4),s(5),s(6));
ode3 = Ez + s(1).*By(s(4),s(5),s(6)) - s(2).*Bx(s(4),s(5),s(6));
ode4 = s(1);
ode5 = s(2);
ode6 = s(3);

refsolve = [ode1; ode2; ode3; ode4; ode5; ode6];

end

“ B_test.m”

function [Bx, By, Bz] = B_test()

%Bfieldstrength = 0.64; %In (Teslas)
Bfieldstrength = 0;
magvol = 3.218E-6; %In (m)
mu0 = (4*pi)*10^-7;
magnetization = (Bfieldstrength*magvol)/mu0;

syms x y z
m = [0,0,magnetization];
r = [x, y, z];
B = mu0*(((dot(m,r)*r*3)/norm(r)^5) - m/norm(r)^3);
Bx = matlabFunction(B(1),'vars',r);
By = matlabFunction(B(2),'vars',r);
Bz = matlabFunction(B(3),'vars',r);

end

最初我遇到了错误:

Error using symengine>@()0.0
Too many input arguments.
Error in reffun (line 14)
ode1 = Ex + s(2).*Bz(s(4),s(5),s(6)) - s(3).*By(s(4),s(5),s(6));
Error in odearguments (line 90)
f0 = feval(ode,t0,y0,args{:});   % ODE15I sets args{1} to yp0.
Error in ode15s (line 150)
    odearguments(FcnHandlesUsed, solver_name, ode, tspan, y0, options, varargin);
Error in diffiqtest (line 7)
[t,S] = ode15s(@reffun,tspan,s0);

但是,在Matlab论坛上,有人建议我在调用matlabFunction时添加另一个输入“ vars,r”。这里的另一个奇怪之处是,即使我应用了此方法(并清除了所有持久变量),代码仍然根本没有运行。我告诉他了,所以他向我提供了他的代码,即使输入了完全相同的行,代码也能正常工作。考虑到我知道解决方案的外观,但我尝试使用他的文件输入初始条件,但它们不正确。再次,他的代码与我的代码完全相同,被复制并粘贴,并且恰好起作用。

这个问题发生在我一直在研究的更长的代码中,但是我决定回到最简单的形式来重现此问题,以便不劝阻其他人提供帮助。我确实处于停滞状态,因此我们欢迎任何有建设性的建议。

0 个答案:

没有答案
相关问题