标题本身就说明了这一点。我在纸面上实现了一个完美的算法,但不是在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内的参数?
发布于 2017-04-24 11:49:26
在你的例子中
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);https://stackoverflow.com/questions/43586768
复制相似问题