FPUT问题:重复FPUT回归(MATLAB代码)

FPUT是四个人名的缩写:Fermi-Pasta-Ulam-Tsingou,该问题是指某些非线性系统不会分散它们的能量(能量均分状态),而是回到初始激发状态,这一违背常理的现象被称为FPUT问题。FPUT问题直接导致了非线性科学的诞生,并引领人们进入了使用计算机进行科学计算的时代。

1955年费米(Fermi),帕斯塔(Pasta)和乌拉姆(Ulam)为了验证经典统计物理中能量均分原理而设计了一个数值试验,他们将64个质点用非线性弹簧连成一个振动弦, 开始能量只集中在第一模态, 按照能量均分原理, 由于弱非线性相互作用, 长时间以后应该导致能量有涨落的平均分布到所有模态从而达到能量均分状态。开始的计算结果确实表明能量在向其他模态转移, 但是出于意料的事, 长时间演化以后几乎全部能量又回到了初始分布状态, 这和能量均分原理完全不一致。这一“ 违背常理” 的现象后来以三位发现者姓名的首字母命名为FPU重现(FPU recurrent),这一问题被称为Fermi-Pasta-Ulam-Tsingou问题。此外, 由于该数值试验是由Mary Tsingou编程实现并将结果最终以图表的形式展示出来, 考虑到在第一台计算机上设计第一个数值实验在当时的难度, Dauxois呼吁应该将其称为Fermi-Pasta-Ulam-Tsingou问题,以此表示对Tsingou在该研究中所做贡献的尊重。

将若干个质点用非线性弹簧连成一个振动弦

 图片来源:http://www.scholarpedia.org/

系统哈密顿量

H=\sum_{i=1}^N \frac{x_i^2}{2}+\sum_{i=0}^N[\frac{1}{2} (x_{i+1}-x_i )^2+\frac{\alpha}{3} (x_{i+1}-x_i )^3+\frac{\beta}{4} (x_{i+1}-x_i )^4]

\omega_i=2sin\frac{i\pi}{2(N+1)}

\psi_{ij}=\sqrt{\frac{2}{N+1}}sin\frac{ij\pi}{N+1}

可移动粒子数N=31,即共有33个粒子

初始位移:第一个本征模式

x_i=sin\frac{i\pi}{32}

初始速度:所有原子均为0

模拟步长:0.01

模拟步数:1000000

计算时要注意的几个要点

模拟结果

 

 

源代码(MATLAB)

clear;
clc;
N=31;
dt=1;ddt=0.01;%步长0.01
totalt=1000000;%步数1000000
alpha=0.25;
beta=0;%只计算到2阶
omega=zeros(N+2,1);
psi=zeros(N+2,N+2);
xx=zeros(N+2,totalt);
vv=zeros(N+2,totalt);
aa=zeros(N+2,totalt);
%第一个时刻:初始化
for ii=2:N+1
    omega(ii)=2*sin((ii-1)*pi/(2*(N+1)));
    xx(ii,1)=sin((ii-1)*pi/32);
    vv(ii,1)=0;
end
for ii=2:N+1
    for jj=2:N+1
        psi(ii,jj)=sqrt(2/(N+1))*sin((ii-1)*(jj-1)*pi/(N+1));
    end
end
%用牛顿运动定律,粗略算出第二个时刻的位置、速度
for ii=2:N+1
    aa(ii,1)=(xx(ii+1,1)+xx(ii-1,1)-2*xx(ii,1))+alpha*((xx(ii+1,1)-xx(ii,1))^2-(xx(ii,1)-xx(ii-1,1))^2)+beta*((xx(ii+1,1)-xx(ii,1))^3-(xx(ii,1)-xx(ii-1,1))^3);
    xx(ii,2*dt)=xx(ii,1)+vv(ii,1)*ddt+0.5*aa(ii,1)*ddt^2;
    vv(ii,2*dt)=vv(ii,1)+aa(ii,1)*ddt;
end
%verlet算法,用前两个时刻的位置算出第三个时刻的位置,以此类推,算出所有时刻的位置、速度、加速度
for t=2:dt:totalt
    for ii=2:N+1
        aa(ii,t)=(xx(ii+1,t)+xx(ii-1,t)-2*xx(ii,t))+alpha*((xx(ii+1,t)-xx(ii,t))^2-(xx(ii,t)-xx(ii-1,t))^2)+beta*((xx(ii+1,t)-xx(ii,t))^3-(xx(ii,t)-xx(ii-1,t))^3);
        xx(ii,t+dt)=2*xx(ii,t)-xx(ii,t-dt)+aa(ii,t)*ddt^2;
        vv(ii,t)=(xx(ii,t+dt)-xx(ii,t-dt))/(2*ddt);
    end
end

ii=1:N+2;
%h=plot(ii,xx(:,34));
qq=zeros(1,N+2);pp=zeros(1,N+2);energy=zeros(N+2,totalt);
sum_energy=zeros(totalt,1);

for t=1:dt:totalt
    qq=psi*xx(:,t);%将普通坐标变换为简正坐标
    pp=psi*vv(:,t);
    energy(:,t)=0.5*(pp.*pp+omega.*omega.*qq.*qq);
end
%取前五个简正模式,绘图
plot(1:dt:totalt,energy(1:5,:))

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Delphi是全新的可视化编程环境,为我们提供了一种方便、快捷的Windows应用程序开发工具。它使用了Microsoft Windows图形用户界面的许多先进特性和设计思想,采用了弹性可重复利用的完整的面向对象程序语言(Object-Oriented Language)、当今世界上最快的编辑器、最为领先的数据库技术。对于广大的程序开发人员来讲,使用Delphi开发应用软件,无疑会大大地提高编程效率,而且随着应用的深入,您将会发现编程不再是枯燥无味的工作——Delphi的每一个设计细节,都将带给您一份欣喜。  1.1 Delphi基本概念介绍  1.1.1 Delphi的基本形式  Delphi实际上是Pascal语言的一种版本,但它与传统的Pascal语言有天壤之别。一个Delphi程序首先是应用程序框架,而这一框架正是应用程序的“骨架”。在骨架上即使没有附着任何东西,仍可以严格地按照设计运行。您的工作只是在“骨架”中加入您的程序。缺省的应用程序是一个空白的窗体(Form),您可以运行它,结果得到一个空白的窗口。这个窗口具有Windows窗口的全部性质:可以被放大缩小、移动、最大最小化等,但您却没有编写一行程序。因此,可以说应用程序框架通过提供所有应用程序共有的东西,为用户应用程序的开发打下了良好的基础。Delphi已经为您做好了一切基础工作——程序框架就是一个已经完成的可运行应用程序,只是不处理任何事情。您所需要做的,只是在程序中加入完成您所需功能的代码而已。 在空白窗口的背后,应用程序的框架正在等待用户的输入。由于您并未告诉它接收到用户输入后作何反应,窗口除了响应Windows的基本操作(移动、缩放等)外,它只是接受用户的输入,然后再忽略。Delphi把Windows编程的回调、句柄处理等繁复过程都放在一个不可见的Romulam覆盖物下面,这样您可以不为它们所困扰,轻松从容地对可视部件进行编程。 1.1.2 面向对象编程的概念  面向对象的程序设计(Object-Oriented Programming,简记为OOP)是Delphi诞生的基础。OOP立意于创建软件重用代码,具备更好地模拟现实世界环境的能力,这使它被公认为是自上而下编程的优胜者。它通过给程序中加入扩展语句,把函数“封装”进Windows编程所必需的“对象”中。面向对象的编程语言使得复杂的工作条理清晰、编写容易。说它是一场革命,不是对对象本身而言,而是对它们处理工作的能力而言。对象并不与传统程序设计和编程方法兼容,只是部分面向对象反而会使情形更糟。除非整个开发环境都是面向对象的,否则对象产生的好处还没有带来的麻烦多。而Delphi是完全面向对象的,这就使得Delphi成为一种触手可及的促进软件重用的开发工具,从而具有强大的吸引力。 一些早期的具有OOP性能的程序语言如C++,Pascal,Smalltalk等,虽然具有面向对象的特征,但不能轻松地画出可视化对象,与用户交互能力较差,程序员仍然要编写大量的代码。Delphi的推出,填补了这项空白。您不必自己建立对象,只要在提供的程序框架中加入完成功能的代码,其余的都交给Delphi去做。欲生成漂亮的界面和结构良好的程序丝毫不必绞尽脑汁,Delphi将帮助您轻松地完成。它允许在一个具有真正OOP扩展的可视化编程环境中,使用它的Object Pascal语言。这种革命性的组合,使得可视化编程与面向对象的开发框架紧密地结合起来。 1.2 Delphi 快速入门  在这一节中,我们来开发一个小程序。随着开发的过程,逐步介绍Delphi的主要部件及其操作方法。建议读者按照本书介绍的过程,在您的电脑上直接操作。您将对Delphi的可视化编程有一个直观、快捷的了解,必将起到事半功倍的效果。  1.2.1 进入Delphi的可视化编程环境 1.2.1.1 安装Delphi  Delphi的安装与其它应用软件并无不同。2.0版必须在Windows 95以上的操作系统中使用。启动Windows 95或Windows NT后,将Delphi的光盘放入光驱(CD-ROM)中,运行光盘上的\INSTALL\SETUP.EXE文件,它的安装程序会提示您正确地装入Delphi。如果您是在微软中文Windows环境中安装Delphi,请参照附录A来设置您的BDE环境,以便于处理中文数据。  1.2.1.2 进入Delphi 环境 为避免隐藏在Delphi后的Program Manager和曾经运行过的其它程序扰乱版面,分散您的注意力,不妨在启动Delphi前关掉其它应用程序;启动Delphi后,再最小化隐藏在后面的Delphi 2.0程序组。这样屏幕上就只留下Delphi窗口可见了。 首次加载Delphi,屏幕上会出现四个窗口: ● 标题为“Delphi-Project1”的Delphi主窗口 ● Object Inspector窗口 ● 标题为“Form1”的窗体(Form)窗口 ● 标题为“Unit1.PAS”的代码编辑窗口。刚启动时这一窗口的大部分被“Form1”窗体所掩盖。将“Form1”窗体移开,或单击Form1窗体下方的状态行,可以使其全部可见。在“Form1”窗体的任意可见位置单击鼠标,可以恢复主窗体可见 以下我们将对这四个窗口分别进行介绍。  1.2.2 Delphi可视化编程环境介绍  1.2.2.1 主窗口(Main Form)  Delphi的主窗口位于屏幕的上端,包括Menu(菜单)、Speed Bar(加速条)和Component Panel(部件选项板)。Menu是下拉式主菜单。Speed Bar位于主窗口的左下端,由两排共14个加速按钮组成。这些按钮是菜单功能的快捷方式,各种图标直观地表示了它能执行的动作。Component Panel由一行、若干页对象按钮所组成,利用它来选择需要的部件并将它放到窗体中去。  1.2.2.2 Object Inspector(对象检视器)  Object Inspector窗口含有两页:Properties页显示窗体中当前被选择部件的属性信息,并允许改变对象的属性;Events页列出了当前部件可以响应的事件。按动Object Inspector下端的“Events”页标签,使得Events页可见,这一定的事件后边的空白处,可以定义对象接受到相应事件时执行的动作。首次启动时,Object Inspector窗口显示的是当前窗体Form1的属性。Object Inspector根据对象属性的多少,决定是否有滚行显示。移动滚行条,可以查看当前对象的全部属性。 此外,Object Inspector上还有Object Selector(对象选择器),位于Object Inspector上方的下拉式菜单中。它显示了窗体上所有部件的名称和类型,也包含窗体本身。您可以用Object Selector很容易地在窗体的各个部件之间切换,也可以快速地回到窗体本身。当窗体中含有较多的对象时,您会发现这是切换对象尤其是回到窗体的最快捷途径。 想使Object Inspector一直可见,可将鼠标移到Object Inspector上,按动右键,以启动Object Inspector的弹出式菜单,将其设置为Stay On Top。这对初学者常是一个很重要的设置方式。  1.2.2.3 窗体窗口  Forms窗口是开展大部分设计的工作区域。首次启动Delphi 2.0时显示的是窗体Form1。可以把部件放在窗体中,通过移动位置、改变尺寸等操作随心所欲地安排它们,以此来开发应用程序的用户界面。您可以把窗体想象成一个可以放置其它部件的容器。窗体上有栅格(Grids),供放置部件时对齐位置用,在程序运行时Grids是不可见的。 一个真正的应用程序可能有不止一个窗口,您可以选用不同的窗体进行设计。其它窗体可以是对话框(Dialog Box)、数据录入框等。  1.2.2.4 代码窗口  代码窗口一开始处于窗体窗口之下。因为在Delphi中,设计用户界面直接在窗体中进行,运行结果和设计样板完全一致。当部件被放到窗体上时,Delphi会自动生成大部分的用户界面代码。您所应做的只是在它为您生成的框架中加入完成所需功能的程序段而已。点动Form1的状态行使代码窗口可见。 这个窗口中是代码编辑器。可以在其中书写Delphi应用程序的源代码。当程序中含有不止一个窗口时,会有几个库单元的源程序出现在代码编辑器中。代码编辑器的标题条中显示了当前正在编辑的库单元文件名。要查看某一特定程序的源代码,只需用鼠标点动写有该库单元文件名的页标签,就可以对该库单元进行编辑了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值