7

我正在尝试用来ode45解决 ODE 的系统:

[X,Y]=  ode45(@sys,[0, T],y0);

在哪里,

function dy = sys(t,y)

        dy(1) = f_1(y)
        dy(2) = f_2(y)
        dy(3) = f_3(y)
end

问题是该函数ode45要求它y0是初始值[y_1(0), y_2(0), y_3(0)],而在我的系统中,我只有[y_2(0), y_3(0), y_3(T)]可用的值。

从数学上讲,这组初始/终止条件应该足以确定系统,但是有什么方法可以通过ode45MATLAB 或任何其他函数来处理?

谢谢!

4

2 回答 2

6

在挖掘了一点 Matlab 文档之后,我认为更优雅的方法是使用该bvp4c函数。bvp4c是一个专门设计用于处理这样的边界值问题的函数,而不是ode**,它实际上仅用于初始值问题。事实上,Matlab 中还有一整套其他函数,例如devalbvpinit,真正方便了bvp4c. 这是Matlab 文档的链接

我将在这里发布一个简短的(也许有点做作)示例:

function [y1, y2, y3] = test(start,T)

solinit = bvpinit(linspace(0,3,10), [1,1,0]);
sol = bvp4c(@odefun,@bvpbc,solinit);

tspan = linspace(start,T,100);
S = deval(sol, tspan);
y1 = S(1,:);
y2 = S(2,:);
y3 = S(3,:);

plot (tspan,y1)

figure
plot (tspan,y2)

figure
plot (tspan,y3)


%% system definition & BVCs

function dydx = odefun(t,y)
    dydx(1) = y(1) + y(2) + t;

    dydx(2) = 2*y(1) + y(2);

    dydx(3) = 3 * y(1) - y(2);
end

function res = bvpbc(y0,yT)
   res= [y0(3) yT(2) yT(3)];
end

end

test函数分别输出 和 的 3 个解点向量y1y2y3绘制它们。

以下是 Matlab 绘制的变量路径: y1 路径 y2 路径 y3 路径

此外,我发现WMU的 Jake Blanchard 教授的这段视频非常有帮助。

于 2013-06-14T10:18:24.807 回答
3

一种方法是使用射击方法迭代求解未知的初始状态,从而满足y_1(0)所需的最终状态y_3(T)

迭代通过求解非线性方程 进行F = 0

F(y_1(0)) = Y_3(T) - y_3(T)

其中大写函数是根据一组初始条件对 ODE 的前向Y积分得到的解。任务是猜测 的值以获得。y_1(0)F = 0

由于我们现在正在求解非线性方程,因此所有常用方法都适用。具体来说,您可以使用二分法或牛顿法来更新您对未知初始状态的猜测y_1(0)。注意几件事:

  1. [0,T]ODE在非线性求解的每次迭代中被积分。
  2. 可能有多种解决方案F = 0,具体取决于您的 ODE 的结构。
  3. 牛顿法的收敛速度可能比二分法更快,但也可能在数值上不稳定,除非您可以为y_1(0).

使用现有的 MATLAB 函数,有界标量非线性求解器FMINBND可能是作为非线性求解器的不错选择。

希望这可以帮助。

于 2013-06-14T09:29:19.683 回答