ODE求解器中的已知函数

时间:2014-05-14 22:47:18

标签: matlab ode

我是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

2 个答案:

答案 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)创建一个匿名函数xyode45期望一个函数只接受两个输入),从而捕获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