基于FPGA的Hamiton方程--辛几何算法实现(全网唯一)

news2025/7/16 10:33:21

1、本文实验基于冯康院士的《哈密尔顿系统的辛几何算法》开展,链接:https://pan.baidu.com/s/1GM0Px7SLWBWzh4sXmAdcwg 
提取码:fmkt

2、虽然题目写的是基于FPGA的求解,但实际上采用的是VHLS来实现的,最近根本不想写verilog算法代码。本实验做的是简单谐振子运动方程组的运算,会给出matlab代码以及相应的FPGA仿真截图。

3、Hamiton方程

3.1.谐振子Hamiton方程的一般形式

\left\{\begin{matrix} \dot{p}=-\frac{\partial H(p,q))}{\partial q}=-\omega ^{2}q\\ \dot{q}=\frac{\partial H(p,q))}{\partial p}=p\end{matrix}\right.

初始条件为:

q(0)=q_{0},p(0)=p^2

其精确解为:

\left( {\begin{array}{*{20}{c}} {q\left( t \right)}\\ {p\left( t \right)} \end{array}} \right) = \left( {\begin{array}{*{20}{c}} {\cos \left( {\omega t} \right)}&{\frac{1}{\omega }\sin \left( {\omega t} \right)}\\ { - \omega \sin t}&{\cos \left( {\omega t} \right)} \end{array}} \right)\left( {\begin{array}{*{20}{c}} {​{q_0}}\\ {​{p_0}} \end{array}} \right)

3.2 采用《哈密尔顿系统的辛几何算法》第225页的一阶差分形式展开:

  由论文《Hamilton系统下基于相位误差的精细辛算法》

\left\{ {\begin{array}{*{20}{c}} {p_i^{k + 1} = p_i^k - \tau {V_{qi}}\left( {​{q^{k + 1}}} \right)}\\ {q_i^{k + 1} = q_i^k + \tau {U_{pi}}\left( {​{p^k}} \right)} \end{array}} \right.\

因此,可得:

\left( {\begin{array}{*{20}{c}} {​{q_{k + 1}}}\\ {​{p_{k + 1}}} \end{array}} \right) = \left( {\begin{array}{*{20}{c}} 1&\tau \\ { - {\omega ^2}\tau }&{1 - {\omega ^2}{\tau ^2}} \end{array}} \right)\left( {\begin{array}{*{20}{c}} {​{q_k}}\\ {​{p_k}} \end{array}} \right)\​​​​​​​

采用精细化算法可得:

 4、RK算法、一阶辛精细化算法、辛RK算法、梯形法、解析法的matlab代码

%作者:Yang Zheng
%机构:东北电力大学
%内容:对Hamilton系统的求解。 设K=4,C=R=0,M=1,则为哈密尔顿方程。于是有:dq/dt=-p;dp/dt=-4q
% RK算法
tau=0.5;
time=1000;
q0=1;
q2=0.9801;

p0=0;
p2=-0.3973;
q=zeros(ceil(time/tau),1);
p=q;
n=1;
q(n)=q0;
p(n)=p0;
A=[1 -tau/6;2*tau/3 1];
while(n<ceil(time/tau))
    B1=[q0+tau/6*(p0+2*p2);p0-2*tau/3*(q0+2*q2)];
    qp1=A\B1;
    q1=qp1(1);p1=qp1(2);
    
    B2=[q2+tau/6*(p2+2*p1);p2-2*tau/3*(q2+2*q1)];
    qp2=A\B2;
    q2=qp2(1);p2=qp2(2);
    
    %更新
    q0=q1;
    p0=p1;
    %赋值
    n=n+1;
    q(n)=q0;
    p(n)=p0;
end
plot(p,q,'r');
hold on;

% 辛1阶算法
N=10;%精细度
E=eye(2);
w=2;
B=[0 tau/2^N;-w^2*tau/2^N -w^2*(tau/2^N)^2];
%B=[w^2*(tau/2^N)^2 -w^2*tau/2^N;-tau/2^N 0];
for i = 1:N
    B=B*B+2*B;
end
M=E+B;
n=1;
q0=1;
p0=0;
q(n)=q0;
p(n)=p0;
while(n<ceil(time/tau))
    xqp=M*[q0 p0]';
    q0=xqp(1);
    p0=xqp(2);
    q(n)=q0;
    p(n)=p0;
    n=n+1;
end
plot(p,q,'y');
hold on;
% 辛RK算法
g=w*tau;
J=1/(g^4+12*g^2+144)*[g^4-60*g^2+144 12*tau*(12-g^2);-12*g*w*(12-g^2) g^4-60*g^2+144];
n=1;
q0=1;
p0=0;
q(n)=q0;
p(n)=p0;
while(n<ceil(time/tau))
    xqp=J*[q0 p0]';
    q0=xqp(1);
    p0=xqp(2);
    q(n)=q0;
    p(n)=p0;
    n=n+1;
end
plot(p,q,'k');
hold on;
%梯形法
q0=1;
p0=0;
q=zeros(ceil(time/tau),1);
p=q;
n=1;
q(n)=q0;
p(n)=p0;
A=[1 -tau/2;2*tau 1];
while(n<ceil(time/tau))
    B1=[q0+tau/2*p0;p0-2*tau*q0];
    qp1=A\B1;
    q1=qp1(1);p1=qp1(2);
    %更新
    q0=q1;
    p0=p1;
    %赋值
    n=n+1;
    q(n)=q0;
    p(n)=p0;
end
plot(p,q,'g');
hold on;
% 原方程
T=1:tau:time;
plot(-2*sin(2*T),cos(2*T),'b');

仿真结果:

 可以看到,RK法已经完全失真。

 可以看到,梯形法没有长时追踪能力。一阶辛精度很高,可以追踪;辛RK没有精细化算法,但仍然可以追踪,较精细化算法误差较大。

5、基于辛RK算法的谐振子方程组求解代码

%作者:Yang Zheng
%机构:东北电力大学
%内容:对Hamilton系统的求解。 设K=[k1,k2,...,kn],C=R=0,M=1,则为哈密尔顿方程组。K=w^2
function [q,p,q_ref,p_ref]=mul_diff_SRK(K)
    %% 辛RK
    N=length(K);
    w=sqrt(K);
    tau=0.5;
    time=1000;
    g=w*tau;
    J=zeros(2,2*N);
    for i = 1 :N
        J(:,2*i-1:2*i)=1/(g(i)^4+12*g(i)^2+144)*[g(i)^4-60*g(i)^2+144 12*tau*(12-g(i)^2);-12*g(i)*w(i)*(12-g(i)^2) g(i)^4-60*g(i)^2+144];
    end
    
    
    n=1;
    q0=ones(1,N);
    p0=zeros(1,N);
    q=zeros(ceil(time/tau),N);
    p=q;
    q(n,:)=q0;
    p(n,:)=p0;
    while(n<ceil(time/tau))
        for i = 1 :N
            xqp=J(:,2*i-1:2*i)*[q0(i) p0(i)]';
            q0(i)=xqp(1);
            p0(i)=xqp(2);
        end
        q(n,:)=q0;
        p(n,:)=p0;
        n=n+1;
    end

    %% 画出原图
    T=tau:tau:time;
    q_ref=zeros(ceil(time/tau),N);
    p_ref=zeros(ceil(time/tau),N);
    for i = 1 :N
        q_ref(:,i)=cos(w(i)*T);
        p_ref(:,i)=-w(i)*sin(w(i)*T);
    end
end

6、辛RK的vivado仿真结果,需要代码请联系作者邮箱!

 

 ​​​​​​​

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/36335.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

m基于rbf神经网络和遗传算法优化的MIMO-OFDM系统信道估计算法matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法描述 MIMO-OFDM的信道估计&#xff1a;时&#xff0c;频&#xff0c;空三个域都要考虑&#xff0c;尤其是在空域&#xff0c;不同天线发射的导频序列需要相互正交&#xff0c;否则在接收端无法…

使用星凸随机超曲面模型对扩展对象和分组目标进行形状跟踪(Matlab代码实现)

&#x1f352;&#x1f352;&#x1f352;欢迎关注&#x1f308;&#x1f308;&#x1f308; &#x1f4dd;个人主页&#xff1a;我爱Matlab &#x1f44d;点赞➕评论➕收藏 养成习惯&#xff08;一键三连&#xff09;&#x1f33b;&#x1f33b;&#x1f33b; &#x1f34c;希…

学习Python要学习哪些课程?

通过学习 Python数据分析与应用课程&#xff0c;可以掌握Python进行科学计算、可视化绘图、数据处理&#xff0c;分析与建模、构建聚类、回归、分类模型的主要方法和技能&#xff0c;并为后续相关课程学习及将来从事数据分析挖掘研究、数据分析工作奠定基础。 Python数据分析与…

进程互斥以及进程互斥实现方法(包含代码)

进程互斥有关概念&#xff1a; 两种资源共享方式&#xff1a; 1.互斥共享&#xff1a;一个时间段内只允许一个进程进行访问 2.同时共享&#xff1a;一个时间段内允许多个进程进行“同时”访问 临界资源&#xff1a;一个时间段内只允许一个进程进行访问的资源 访问临界区的…

第二章 爬虫的实现原理和技术(一)

2.1 爬虫的实现原理 不同类型的爬虫,具体的实现原理也不尽相同,但是这些爬虫之间存在许多共性。下面我将以通用爬虫与聚焦爬虫为例,具体来讲解爬虫是如何来运作的。 通用爬虫的工作原理 通用爬虫是一个自动提取网页的程序,能够从Internet上下载网页,是大多的搜索引擎的…

关于FFmepg的冷知识,这一篇就够了

每一个从事音视频技术开发的工程师对FFmpeg都不会感到陌生&#xff0c;即使是刚刚踏入这个行业的初学者&#xff0c;但对他们来说这条路上好像有着一条不可逾越的鸿沟&#xff0c;“雷神”和许多大神都总结过一些FFmpeg的学习方法&#xff0c;小编在这里为大家做一个整理&#…

《恋上数据结构与算法》第1季:动态数组原理实现(图文并茂,一文带你了解ArrayList底层实现)

动态数组原理实现一、数组&#xff08;Array&#xff09;二、动态数组三、动态数组的设计四、动态数组的实现1. 添加元素2. 数组扩容3. 删除元素4. 数组缩容5. 清空元素6. 修改元素7. 查询元素8. 插入元素9. 查看元素位置10. 是否包含某个元素11. 元素的数量12. 数组是否为空13…

win11的C/C++环境配置——基于MinGW-W64 GCC-8.1.0

首先给出MinGW-W64 GCC-8.1.0的下载地址&#xff1a;MinGW8.1.0 Win11下的C/C环境配置下载MinGW-W64 GCC-8.1.0添加bin文件和include文件到path变量中测试下载MinGW-W64 GCC-8.1.0 网页截图如下&#xff1a; 可以复制下载地址到迅雷中加速&#xff0c;下载完成后的文件如下&a…

MCE | “神药”二甲双胍后,糖尿病药物研究谁将是下一个顶流?

说到糖尿病药物&#xff0c;就不得不提一嘴“神药”二甲双胍&#xff0c;但除了二甲双胍&#xff0c;抗糖尿病药物的研究难道就没有点新玩意儿&#xff1f;当然有&#xff01; 糖尿病 (Diabetes) 是一种以高血糖为特征的慢性代谢病&#xff0c;是由于胰岛素分泌缺陷或者其生物…

美团闪购:闪电仓商户如狼似虎,传统商超便利店坐享其成?

近日&#xff0c;考研网红教师张雪峰一句“外卖员这个职业5-10年内可能会消失”再度登上热搜。 其实&#xff0c;他的这个推论&#xff0c;只是看到了目前外卖骑手的保有量&#xff0c;截至2021年&#xff0c;中国外卖骑手约1300万名。并没有看到炙手可热的“即时消费”新趋势&…

【Shell 脚本速成】05、Shell 运算详解

目录 一、赋值运算 二、算术运算[四则运算] 2.1 运算符与命令 2.2 整形运算 expr 命令&#xff1a;只能做整数运算&#xff0c;格式比较古板&#xff0c;运算符号两边注意空格 let命令&#xff1a;只能做整数运算&#xff0c;且运算元素必须是变量&#xff0c;无法直接对…

MySQL窗口函教-序号函数(row_number、rank、dense_rank)

MySQL窗门函教-序号函数&#xff08;row_number、rank、dense_rank&#xff09; 前言 mysql8.0中新增窗口函数&#xff08;开窗函数&#xff09; 窗口函数和普通聚合函数的区别 ①聚合函数是将多条记录聚合为一条&#xff1b;窗口函数是每条记录都会执行&#xff0c;有几条记…

代码源每日一题div1 区间和

区间和 - 题目 - Daimayuan Online Judge 题意&#xff1a; 思路&#xff1a; 根据前缀和的性质&#xff1a;当已知的前缀和区间是整个区间的划分时&#xff0c;才能求出整个区间的和 因为如果两个区间之间有交叉&#xff0c;交叉部分的和求不出来 因此&#xff0c;如果已知…

DeFi收益来源全面概述

去中心化金融一个主要的优势就是它对所有人开放&#xff0c;任何人在任何时间、任何地点都可以参与其中。这样一来&#xff0c;作为DeFi参与者就有机会获得在传统金融领域很难获得或根本不可能获得的收益。 加密货币的特性是开源的、无需许可的&#xff0c;这将DeFi变成了一个…

【Linux】进程创建/终止/等待/替换

目录 一、子进程的创建 1、fork函数的概念 2、如何理解fork拥有两个返回值 3、fork调用失败的场景 二、进程的终止 1、main函数返回值 1.1main函数的返回值的意义 1.2将错误码转化为错误信息 1.3查看进程的退出码 2、进程退出的情况 1、进程的正常退出与异常退出 2…

Principal branch

In mathematics, a principal branch is a function which selects one branch (“slice”) of a multi-valued function. Most often, this applies to functions defined on the complex plane. Contents1 Examples1.1 Trigonometric inverses1.2 Exponentiation to fraction…

255-261BFC,媒体的类型,媒体的特性,浏览器前缀,媒体查询,逻辑操作符,

◼ 有时候可能会看到有些CSS属性名前面带有:-o-、-xv-、-ms-、mso-、-moz-、-webkit- ◼ 官方文档专业术语叫做:vendor-specific extensions(供应商特定扩展) ◼ 为什么需要浏览器前缀了?  CSS属性刚开始并没有成为标准,浏览器为了防止后续会修改名字给新的属性添加了浏…

树莓派学习笔记(一)

树莓派学习笔记 笔记来自B站UP主【树小悉】的树莓派系列视频的听课笔记&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;适合新手入门&#xff0c;强烈推荐&#xff01;&#xff01;&#xff01; 关机命令 sudo poweroff 关闭电源sodo shutdown -h now 立刻关机sudp shut…

二、进程管理(四)经典同步互斥问题

目录 4.1生产者-消费者问题 4.1.1单类生产者-单类消费者问题 4.1.2多类生产者-多类消费者问题 4.1.3吸烟者问题 4.2读者-写者问题 4.3哲学家进餐问题 分析进程同步和互斥问题的三步&#xff1a; 关系分析&#xff1a;分析问题中的同步&#xff08;前驱关系&#xff09;、…

端口渗透篇:Java RMI 远程代码执行漏洞

转载https://cloud.tencent.com/developer/article/2149191 前言持续更新&#xff1a;整理下渗透测试工作中发现过的漏洞&#xff08;包含漏洞描述、漏洞等级、漏洞验证、修复建议&#xff09;&#xff0c;这里不深究漏洞产生的各种后利用或者绕过方式&#xff0c;漏洞验证过程…