首页 > 其他分享 >龙格-库塔法(Matlab实现)

龙格-库塔法(Matlab实现)

时间:2024-08-25 16:54:05浏览次数:8  
标签:fv yn fx 库塔 tn zx 龙格 zv Matlab

四阶龙格-库塔法介绍

在各种龙格-库塔法当中有一个方法十分常用,以至于经常被称为“RK4”或者就是“龙格-库塔法”。该方法主要是在已知方程导数和初始值时,利用计算机的仿真应用,省去求解微分方程的复杂过程。

令初值问题表述如下:

则,对于该问题的RK4由如下方程给出:

其中:

这样,下一个值(yn+1)由现在的值(yn)加上时间间隔(h)和一个估算的斜率的乘积所决定。该斜率是以下斜率的加权平均:

  • k1是时间段开始时的斜率;
  • k2是时间段中点的斜率,通过欧拉法采用斜率k1来决定y在点tn + h/2的值;
  • k3也是中点的斜率,但是这次采用斜率k2决定y值;
  • k4是时间段终点的斜率,其y值用k3决定。

当四个斜率取平均时,中点的斜率有更大的权值:

RK4法是四阶方法,也就是说每步的误差是h5阶,而总积累误差为h4阶。

注意上述公式对于标量或者向量函数(y可以是向量)都适用。

举例分析

以2022年国赛A题 波浪能最大输出功率设计 第一问为例(有些公式出现的很突兀,建议看一下优秀论文,更易理解)参考资料:2022高教社杯全国大学生数学建模竞赛A题论文展示(A001)

第一问建立的数学模型如下:

需要求解的是浮子与振子的位移和速度,标红表示已知参数

Matlab编程实现

第一题第(1)问完整代码如下:

% 第一题第(1)问
tic

clear;
clc;
close all;

%% 数据初始化
w = 1.4005; %角速度 入射波浪频率
T = (2*pi)/w*40; % 前40个波浪周期
h = 1e-4; % 步长
t = 0:h:T; % 生成自变量t的向量

mf = 4866; % 浮子的质量kg
mz = 2433; % 振子的质量kg
mfu = 1335.535; % 垂荡附加质量
S = mf + mfu;

C_x = 656.3616; % 兴波阻尼
rho = 1025; % 海水密度
g = 9.8; % 重力加速度
A = pi; % 圆柱的横截面积
zf = 6250; % 垂荡激励力振幅(N)
K_tang = 80000;% 弹簧刚度
B = rho*g*A;
V = (0.8*pi)/3;% 圆锥的体积

K_zn = 10000;% 阻尼系数
% 创建计算结果x,y,z,m的数组
N = length(t);
f_x = zeros(1,N); % 浮子的位移
z_x = zeros(1,N); % 振子的位移
f_v = zeros(1,N); % 浮子的速度
z_v = zeros(1,N); % 振子的速度

%% 四阶龙格库塔迭代求解
% k1 = f(tn,yn)
% k2 = f(tn+h/2,yn+h/2*k1)
% k3 = f(tn+h/2,yn+h/2*k2)
% k4 = f(tn+h/2,yn+h*k3)
% y(n+1) = yn + h/6*(k1+2*k2+2*k3+k4)
for i = 2:N
    tn = t(i-1);
    fx = f_x(i-1);
    zx = z_x(i-1);
    fv = f_v(i-1);
    zv = z_v(i-1);

    dfx1 = fv; % yn
    dzx1 = zv;
    dfv1 = (zf*cos(w*tn) + K_zn*(zv-fv) + K_tang*(zx-fx) - C_x*fv - B*fx)/S;
    dzv1 = -(K_zn*(zv-fv) + K_tang*(zx-fx))/mz;

    dfx2 = fv + h/2*dfv1; % yn+k1*h/2 (即v0 + a*t)
    dzx2 = zv + h/2*dzv1;
    dfv2 = (zf*cos(w*(tn+h/2)) + K_zn*(zv+h/2*dzv1-fv-h/2*dfv1) + ...
        K_tang*(zx+h/2*dzx1-fx-h/2*dfx1) - C_x*(fv+h/2*dfv1) - B*(fx+h/2*dfx1))/S;
    dzv2 = -(K_zn*(zv+h/2*dzv1-fv-h/2*dfv1) + K_tang*(zx+h/2*dzx1-fx-h/2*dfx1))/mz;

    dfx3 = fv + h/2*dfv2; % yn+h/2*k2
    dzx3 = zv + h/2*dzv2;
    dfv3 = (zf*cos(w*(tn+h/2)) + K_zn*(zv+h/2*dzv2-fv-h/2*dfv2) + ...
        K_tang*(zx+h/2*dzx2-fx-h/2*dfx2) - C_x*(fv+h/2*dfv2) - B*(fx+h/2*dfx2))/S;
    dzv3 = -(K_zn*(zv+h/2*dzv2-fv-h/2*dfv2) + K_tang*(zx+h/2*dzx2-fx-h/2*dfx2))/mz;

    dfx4 = fv + h*dfv3; % yn+h/2*k3
    dzx4 = zv + h*dzv3;
    dfv4 = (zf*cos(w*(tn+h)) + K_zn*(zv+h*dzv3-fv-h*dfv3) + ...
        K_tang*(zx+h*dzx3-fx-h*dfx3) - C_x*(fv+h*dfv3) - B*(fx+h*dfx3))/S;
    dzv4 = -(K_zn*(zv+h*dzv3-fv-h*dfv3) + K_tang*(zx+h*dzx3-fx-h*dfx3))/mz;

    f_x(i) = fx + h/6*(dfx1+2*dfx2+2*dfx3+dfx4);
    z_x(i) = zx + h/6*(dzx1+2*dzx2+2*dzx3+dzx4);
    f_v(i) = fv + h/6*(dfv1+2*dfv2+2*dfv3+dfv4);
    z_v(i) = zv + h/6*(dzv1+2*dzv2+2*dzv3+dzv4);
end

%% 画图
figure();
subplot('121');
plot(t,f_x,'r');
hold on;
plot(t,z_x-f_x,'b');
plot([0,T],[0,0]);
legend('浮子','振子');
xlabel('时间 s');
ylabel('位移 m');

subplot('122');
plot(t,f_v,'r');
hold on 
plot(t,z_v-f_v,'b');
plot([0,T],[0,0]);
legend('浮子','振子');
xlabel('时间 s');
ylabel('速度 m/s');

resfx=[];
resfv=[];
reszx=[];
reszv=[];
cout=0;
%遍历时间间隔为0.2,前40个波浪周期的垂荡位移和速度
start=find(t==0);
over=find(t==0.2);
dtt=over-start;
index=1;
for xx=0:0.2:T
    cout=cout+1;
    %查找对应时间所在的位置
    %记录位移速度
    resfx(cout)=f_x(index);
    reszx(cout)=z_x(index);
    resfv(cout)=f_v(index);
    reszv(cout)=z_v(index);
    index=index+dtt;
end
time =0:0.2:T;
result = [time',resfx',resfv',reszx',reszv'];
xlswrite('myresult-test',result);

toc

运行结果:

标签:fv,yn,fx,库塔,tn,zx,龙格,zv,Matlab
From: https://blog.csdn.net/lsfff666/article/details/141425734

相关文章

  • 【逐行注释】基于CV/CT模型的IMM|MATLAB程序|源代码复制后即可运行,无需下载
    订阅专栏后可以直接查看完整的源代码(和注释),无需付费下载或其他的操作。代码复制到MATLAB上面可以得到和我一样的运行结果。文章目录程序概述完整代码与逐行注释运行结果解释按模块分析代码程序概述基于EKF的多模型交互。以CV和CT两个模型进行交互,这里对代码进......
  • 【逐行注释】三维EKF的MATLAB代码|源代码直接呈现,无需下载
    文章目录程序概述完整代码与逐行注释运行结果代码块解析订阅专栏后可以直接查看完整的源代码(和注释),无需付费下载或其他的操作。代码复制到MATLAB上面可以得到和我一样的运行结果。程序概述基于MATLAB的EKF(扩展卡尔曼滤波)代码解析。状态转移和观测都是非线性......
  • 【逐行注释】MATLAB下的IMM-EKF代码
    IMM-EKF基于EKF的多模型交互。以CV和CT两个模型进行交互,这里对代码进行逐行注释。注释较多,个人理解的时候如果有误,欢迎指正。每一行都有注释:模型概况二维平面上的运动模型,由CV和CT构成,基于EKF进行滤波,模型是CV(匀速运动)和CT(匀速圆周运动)。代码与逐行解析下载链接:ht......
  • 【船舶航线】基于matlab遗传算法求解船舶航线问题(目标函数:最低成本)【含Matlab源码 734
    ✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,Matlab项目合作可私信或扫描文章底部QQ二维码。......
  • Matlab|电动汽车充电负荷时空分布预测
    目录1 主要内容交通网-配电网交互模型动态交通路网模型交通网络生成代码如下:2 部分代码3 程序结果4下载链接1 主要内容该程序参考《基于动态交通信息的电动汽车充电负荷时空分布预测》和《基于动态交通信息的电动汽车充电需求预测模型及其对配网的影响分析》......
  • 数学建模之Matlab快速入门--全
    前言:本文是之前学Matlab时候做的笔记,很适合快速入门数学建模中matlab和python是最常用的两个软件,现在本人更喜欢python去做数学建模文章目录界面介绍与操作快捷操作数据类型数值型整型浮点型复型逻辑型字符型struct数组cell数组函数句柄日期和时间型数据标准变量储存......
  • 火鹰算法(FHO)优化BP神经网络原理及Matlab代码
    目录0引言1数学模型2优化方式3Matlab代码3.1伪代码3.2FHO主函数代码3.3FHO-BP4视频讲解0引言火鹰优化(FireHawkOptimizer,FHO)算法是由Mahdi Azizi等人于2022年提出一种基于黑鸢(Milvusmigrans)、啸栗鸢(Haliastursphenurus)和褐隼(Falcoberigora)......
  • 火鹰算法(FHO)优化支持向量机原理及Matlab代码
    目录0引言1数学模型2优化方式3Matlab代码3.1伪代码3.2FHO主函数代码3.3FHO-SVM4视频讲解0引言火鹰优化(FireHawkOptimizer,FHO)算法是由Mahdi Azizi等人于2022年提出一种基于黑鸢(Milvusmigrans)、啸栗鸢(Haliastursphenurus)和褐隼(Falcoberigora)......
  • 通过 MATLAB 的 cylinder 函数生成圆柱体的表面坐标,生成表示一个具有非标准形状的圆柱
    MATLAB的机器人系统工具箱(RST)的官方例程PlanaReachingTrajectorywithMultipleKinematicConstraints规划具有多个运动学约束的到达轨迹%创建用于视觉化杯子的点[X,Y,Z]=cylinder(cupRadius*linspace(0,1,50).^0.125);%调整Z坐标的比例,使其符合杯子的高度Z......
  • 回归预测|基于北方苍鹰优化-卷积神经网络-双向长短期记忆网络-自注意力机制的数据回归
    **回归预测|基于北方苍鹰优化-卷积神经网络-双向长短期记忆网络-自注意力机制的数据回归预测Matlab程序多特征输入单输出含基础模型NGO-CNN-BiLSTM-Attention**文章目录前言回归预测|基于北方苍鹰优化-卷积神经网络-双向长短期记忆网络-自注意力机制的数据回归预测M......