通过显式欧拉方法求解 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);
标题不言自明。我实现了一种在纸上完美运行但在 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);