matlab保存ode45计算中间值并绘图

假如要用ode45数值积分求解以下方程:
y ′ ′ = A B t y y^{''}=\frac{A}{B}ty y=BAty
将其降阶得到
y 1 ′ = y 2 y 2 ′ = A B t y 1 y^{'}_1=y_2\\ y_2^{'}=\frac{A}{B}ty_1 y1=y2y2=BAty1
然后我们希望保存计算的中间值 y 1 ′ y_1^{'} y1并绘图,可以这样做:

odefunc.m

function [dydt] = odefunc(t,y,A,B)
%% 要积分的微分方程
dydt = zeros(2,1);
dydt(1) = y(2);
dydt(2) = (A/B)*t.*y(1);

%% 从工作区读取record_dy1数组
record_dy1=evalin('base', 'record_dy1');
record_dy1=[record_dy1 y(2)];
%保存record数组到工作区
assignin('base','record_dy1',record_dy1);

%% 从工作区读取积分时间数组
time=evalin('base', 'time');
%一定要round,消除变步长重复值
time=[time round(t,4)];
assignin('base','time',time);
end

ode45_extend.m

%% 微分方程
A = 1;
B = 2;
tspan = [0 5];
%被积函数dy_1,dy_2初值
y0 = [0 0.01];
%% record_dy1是用来保存要记录的中间值
record_dy1=[];
%time是对应的时间点
time=[];
[t,y] = ode45(@(t,y) odefunc(t,y,A,B), tspan, y0);
%plot(t,y(:,1),'-o',t,y(:,2),'-.')
%% 去除变步长带来的重复值
[B, I] = unique(time, 'first');
%重复值所在索引
duplicated_location=setdiff(1:numel(time), I);
%删除重复值
time(duplicated_location)=[];
record_dy1(duplicated_location)=[];
%% 绘图
plot(time,record_dy1);

运行ode45_extend.m得到结果:
在这里插入图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安布奇

喜欢的朋友给点支持和鼓励吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值