首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用显式欧拉法(MATLAB)求解ODE系统

用显式欧拉法(MATLAB)求解ODE系统
EN

Stack Overflow用户
提问于 2017-04-24 11:23:07
回答 1查看 817关注 0票数 1

标题本身就说明了这一点。我在纸面上实现了一个完美的算法,但不是在Matlab上实现的。如果您熟悉这个方法并不重要,因为我的问题是编码而不是设置一个算法。

代码语言:javascript
复制
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内的参数?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-24 11:49:26

在你的例子中

代码语言:javascript
复制
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的定义修改为

代码语言:javascript
复制
f = @(t,y)[(-y(2)+y(3))*exp(1-y(1))+0.5*y(2),y(2)-y(3)^2];

或者让它成为一个完整的功能

代码语言:javascript
复制
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的情况下更改求解器的调用,然后如下所示

代码语言:javascript
复制
SystemOfEquations_Euler_Explicit(@(t,u)f(u(1),u(2),u(3)), [0,3], [3, 0.2], 0.25);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43586768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档