我是Matlab的新手,很抱歉提出一个平庸且可能已经回答的问题,但我无法解决它。
我有这个ODE来解决
G ''(X)+ F(X)G'(x)的
g(0)= 0且g'(0)= 0.5
f(x)是一个已知的向量,所以我尝试了
xspan = linspace(0,10,100);
y0 = [0,0.5];
%f=f(xspan), known function, for example f=1./xspan;
[x,y] = ode45('odefun',xspan,y0);
和odefun
function dy=odefun(x,y)
global f
dy(1) = y(2);
dy(2) = -f.*y(2);
dy = dy(:);
end
当然它不起作用。如何将向量f
的值传递给求解器?
修改
感谢您的帮助,但这不适合我。也许我有一个旧的Matlab版本(7.11.0(R2010B))?我按照你的说法尝试做,但这是我在命令窗口中得到的
??? In an assignment A(I) = B, the number of elements in B and
I must be the same.
Error in ==> odefun at 3
dy(2) = -f.*y(2);
Error in ==> @(x,y)odefun(x,y,f)
Error in ==> odearguments at 109
f0 = feval(ode,t0,y0,args{:}); % ODE15I sets args{1} to yp0.
Error in ==> ode45 at 173
[neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...
Error in ==> trying at 7
[x,y] = ode45(fun,xspan,y0);
这是代码trying.m
xspan=linspace(0,10,100);
y0=[0 0.5];
f=1./xspan;
[x,y] = ode45(@(x,y)odefun(x,y,f),xspan,y0);
和odefun
function dy=odefun(x,y,f)
dy(1) = y(2);
dy(2) = -f.*y(2);
dy = dy(:);
end
答案 0 :(得分:1)
看起来你错误地使用了global
个变量(f
也需要在你的main函数中声明global
),但你不应该使用全局变量来开始用。 You should rarely, if ever, use globals.您还应该在现代Matlab中将集成函数odefun
指定为anonymous function而不是字符串。以下是修改代码以解决这些问题的方法:
...
f = ...
[x,y] = ode45(@(x,y)odefun(x,y,f),xspan,y0);
您的集成函数可以是sub-function或单独的文件,只需要为参数f
获取额外的参数:
function dy=odefun(x,y,f)
dy(1) = y(2);
dy(2) = -f.*y(2);
dy = dy(:);
这些方法也应该比使用字符串和全局变量更快。代码@(x,y)odefun(x,y,f)
创建一个匿名函数x
和y
(ode45
期望一个函数只接受两个输入),从而捕获f
的值目前的范围。这在计算机科学中也被称为closure。您可以等效地创建一个函数句柄并将其传递给:
...
f = ...
fun = @(x,y)odefun(x,y,f)
[x,y] = ode45(fun,xspan,y0);
有关此常规技术的更多信息,另请参阅The MathWorks中的this article on parametrizing functions。
答案 1 :(得分:0)
我解决了它,并不是那么困难,我只需要在自变量x的每个值处插入f。这样代码就可以了
function dy=odefun(x,y,f,xspan)
f=interp1(xspan,f,x);
dy(1) = y(2);
dy(2) = -f.*y(2);
dy = dy(:);
end