用4阶龙格库塔公式求解微分方程组

公式真的很难编辑,还是直接放源码。

龙格库塔法:runge-kutta)是一种高阶显示一步法,而且不需要计算导数。

间接使用泰勒展开式的方法:用f(x,y)在一些点上函数值的线性组合替代y(x)的各阶导数,构造yn+1的表达式;

比较这个表达式与y(xn+1)x=xn处泰勒展开式,确定yn+1的表达式中的系数,使yn+1的表达式与y(xn+1)泰勒展开式前面的若干项相等,从而具有对应的泰勒展开式的精度阶次。

1.四阶龙格库塔公式函数文件

function varargout = RungeKutta_odes(odefun,xspan,y0,h)
% RungeKutta_odes求解显示微分方程组,用4阶龙格库塔公式
% 调用格式[t,y] = RungeKutta_odes(odefun,xspan,y0,h)
% 调用格式sol = RungeKutta_odes(odefun,xspan,y0,h)
% 输入参数,odefun定义微分方程组的M文件或者匿名形式
% xspan:求解区间,y0:初值,h:步长,缺省0.01
%varargout是可变参数,输出,可以是一个参数,两个参数,三个参数
%varargout是根据调用的参数确定的
%for example 
%[t,y] = RungeKutta_odes(odefun,xspan,y0,h)
%[t,y,m] = RungeKutta_odes(odefun,xspan,y0,h)

%%
%输入参数控制
if nargin == 3
    h = 0.01; % 缺省,步长精度
elseif nargin < 3
    error('此方法是求解带有初值问题的微分方程...')
elseif nargin > 4
    error('输入参数个数too many...')
end

%%
%变量的初始化
t = xspan(1):h:xspan(2); % 根据步长确定子区间,
n = length(t); % 统计变量t的数量,用于循环求解x的值
y = zeros(length(y0),n); % 根据初值判断微分方程组的个数,一行代表一个微分方程解
y(:,1) = y0(:); % 第一列存初值,

%%
%循环求解,使用4阶龙格库塔公式,核心代码
for i = 2:n
    k1 = odefun(t(i-1), y(:,i-1)); %y是所有rows,columns:i-1,公式:K1=f(tn,yn,zn)
    k2 = odefun(t(i-1)+h/2, y(:,i-1)+(h/2)*k1); % K2=f(tn+h/2,yn+h/2*K1,zn+h/2*L1)
    k3 = odefun(t(i-1)+h/2, y(:,i-1)+(h/2)*k2);
    k4 = odefun(t(i-1)+h, y(:,i-1)+h*k3);
    y(:,i) = y(:,i-1)+(h/6)*(k1+2*k2+2*k3+k4);
end

%%
%可变输出参数的判断
if nargout == 2
    varargout{1} = t; % varargout是一个数组,如果输出变量是两个,
    varargout{2} = y;
elseif nargout == 1
    varargout{1}.t = t;
    varargout{1}.y = y;
elseif varargout > 2
    error('输出参数过多too many');
end

%%
%数值可视化
leg = {};
for i = 1:length(y0)
    plot(t,y(i,:))%,'Marker','-','MarkerEdgeColor','green')
    hold on
    leg{i} = strcat('y_',num2str(i),'(t)');
end
hold off
grid on
xlabel('t');ylabel('y');

title('微分方程(组)的数值解曲线')
legend(leg)
legend('boxoff')


end

2.所求函数文件

function dy = dyfun2(t,y)
    dy = [y(2); % y(1)' = y(2)
        y(3); % y(2)' = y(3)
        y(3)/t-3*y(2)/(t^2)+2*y(1)/(t^3)+9*t^3*sin(t)]; % y(3)' 
end

3.主文件,调用两个函数

clc;clear;close all


xspan = [0.1,60];
%xspan = [0,20];
y0 = [1;1;1];
h = 0.02;
% 调用函数
sol = RungeKutta_odes(@dyfun2,xspan,y0,h)

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
法(Runge-Kutta method)是一种常用的数值方法,用于求解微分方程组。它通过离散化微分方程来近似求解,并迭代计算出系统在每个离散时间点上的解。法的基本思想是根据当前的状态和时间步长,通过一系列的计算来估计下一个时间点上的状态。 具体地说,法将微分方程组表示为一组一微分方程,然后使用一定的算法来计算每个方程的斜率。根据这些斜率和时间步长,可以计算出下一个时间点上的解。这个过程会不断迭代,直到达到所需的精度或时间点。 关于微信支付和蚂蚁金服在海外的策略,微信支付主要服务于出境游客,为其提供便捷的支付解决方案,而蚂蚁金服则通过入股当地公司、派驻技术团队等方式,在全球范围内构建本土化的移动支付生态圈。这种本土化的策略可以更好地适应各地的市场需求和支付习惯。 然而,微信在进击印度市场时遇到了一些失败,部分原因是产品设计仍然按照中国市场的习惯进行,没有充分考虑印度市场的特点和需求。这个例子提醒我们,在海外拓展业务时,要注重本土化,根据当地市场的特点来设计产品和服务,以提供更好的用户体验和满足当地用户的需求。 综上所述,法是用于求解微分方程组的一种数值方法,微信支付和蚂蚁金服在海外采取了不同的策略来扩大业务,而微信在印度市场的失败也提醒我们要注重本土化。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [阿里腾讯进击韩国互联网](https://blog.csdn.net/tangxiaoyin/article/details/91490165)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值