在处理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”。这里的另一个奇怪之处是,即使我应用了此方法(并清除了所有持久变量),代码仍然根本没有运行。我告诉他了,所以他向我提供了他的代码,即使输入了完全相同的行,代码也能正常工作。考虑到我知道解决方案的外观,但我尝试使用他的文件输入初始条件,但它们不正确。再次,他的代码与我的代码完全相同,被复制并粘贴,并且恰好起作用。
这个问题发生在我一直在研究的更长的代码中,但是我决定回到最简单的形式来重现此问题,以便不劝阻其他人提供帮助。我确实处于停滞状态,因此我们欢迎任何有建设性的建议。