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

时间:2017-04-24 11:23:07

标签: matlab ode

标题不言而喻。我实现了一种在纸上完美运行的算法,但它不在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中的那些?

1 个答案:

答案 0 :(得分:2)

在你的例子中

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);