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