通过显式欧拉方法求解 ODE 系统 (MATLAB)

Solving a system of ODE's via explicit Euler method (MATLAB)

标题不言自明。我实现了一种在纸上完美运行但在 Matlab 上运行不佳的算法。您是否熟悉该方法并不重要,因为我的问题是编码而不是设置算法。

function [t, r] = SystemOfEquations_Euler_Explicit(f, interval, r0, h)

% f is a set of functions like : f = @ (x1,...,xn)[f1,...fn]

% interval specifies the range that i want to solve ODE's 

% r0 is the initial value's of f1,..fn

% h is step size 



N = length(r0)

t = interval(1):h:interval(2)

n = length(t)

r = zeros(n, N)

r(1,:) = r0

for i = 1:n-1

% Here is the problem , it cain't evaluate the function at r(i,:)
r(i+1, :) = r(i, :)+h*f(t(i),r(i,:)) 

end



end

正如我在评论中提到的,我需要评估 f 中每个函数中的一组 n 个数据点,因此我有第一个参数,它始终是一个数字 nl。 t(i) 但 n-1 个参数已经在矩阵 r 的行中初始化,我如何访问 f 中的那些?

在你的例子中

f = @(x,y,z)[(-y+z)*exp(1-x)+0.5*y,y-z^2];
SystemOfEquations_Euler_Explicit(f, [0,3], [3, 0.2], 0.25);

给定的函数 f 有 3 个参数,而求解器需要一个有 2 个参数的函数。修复此问题的最简单自然的方法是将 f 的定义调整为

f = @(t,y)[(-y(2)+y(3))*exp(1-y(1))+0.5*y(2),y(2)-y(3)^2];

或者让它成为一个完整的函数

function prime = f(t,u)
    x=u(1); y=u(2); z=u(3);
    prime = [(-y+z)*exp(1-x)+0.5*y,y-z^2];
end;

您也可以只更改求解器的调用而不更改 f,这看起来像

SystemOfEquations_Euler_Explicit(@(t,u)f(u(1),u(2),u(3)), [0,3], [3, 0.2], 0.25);