声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2260|回复: 5

[分形与混沌] Pendulum Poincare map

[复制链接]
发表于 2011-5-4 10:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
// PendulumPoincare.java
import java.awt.*;
import java.awt.event.*;
import java.awt.Graphics;
public class PendulumPoincare extends Frame
{
  public PendulumPoincare()
  {
  setSize(600,500);
  addWindowListener(new WindowAdapter()
  { public void windowClosing(WindowEvent event)
  { System.exit(0); }}); }
  public void fsystem(double h,double t,double u[],double hf[])
  {
  double a = 0.2, b = 1.0;
  double k = 1.09; double Omega = 0.8;  
  hf[0] = h*u[1];
  hf[1] = h*(-a*u[1]-b*Math.sin(u[0])+k*Math.cos(Omega*t));
  }
  public void map(double u[],int steps,double h,double t,int N)
  {
  double uk[] = new double[N];
  double tk;
  double a[] = { 0.0, 1.0/4.0, 3.0/8.0, 12.0/13.0, 1.0, 1.0/2.0 };
  double c[] = { 16.0/135.0, 0.0, 6656.0/12825.0, 28561.0/56430.0,
                 -9.0/50.0, 2.0/55.0 };
  double b[][] = new double[6][5];
  b[0][0] = b[0][1]= b[0][2] = b[0][3] = b[0][4] = 0.0;
  b[1][0] = 1.0/4.0; b[1][1] = 0.0; b[1][2] = 0.0; b[1][3] = 0.0;
  b[1][4] = 0.0;
  b[2][0] = 3.0/32.0; b[2][1] = 9.0/32.0;
  b[2][2] = 0.0; b[2][3] = 0.0; b[2][4] = 0.0;
  b[3][0] = 1932.0/2197.0; b[3][1] = -7200.0/2197.0;
  b[3][2] = 7296.0/2197.0; b[3][3] = b[3][4] = 0.0;
  b[4][0] = 439.0/216.0; b[4][1] = -8.0;
  b[4][2] = 3680.0/513.0; b[4][3] = -845.0/4104.0; b[4][4] = 0.0;
  b[5][0] = -8.0/27.0; b[5][1] = 2.0; b[5][2] = -3544.0/2565.0;
  b[5][3] = 1859.0/4104.0; b[5][4] = -11.0/40.0;
  double f[][] = new double[6][N];
  for(int i=0;i<steps;i++)
  {
  fsystem(h,t,u,f[0]);
  for(int k=1;k<=5;k++)
  { tk = t+a[k]*h;
  for(int l=0;l<N;l++)
  { uk[l] = u[l];
  for(int j=0;j<=k-1;j++) uk[l] += b[k][j]*f[j][l];
  }
  fsystem(h,tk,uk,f[k]);
  }
  for(int l=0;l<N;l++)
   for(int k=0;k<6;k++) u[l] += c[k]*f[k][l];
  }
  }
  public void paint(Graphics g)
  {
  g.drawRect(40,40,500,450);
  int steps = 1; int N = 2; int counter = 0;
  double h = 0.005;  double Omega = 0.8;  double t = 0.0;
  double u[] = { 0.8, 0.6 };  // initial conditions
  for(int i=0;i<800000;i++)
  {
  t += h; map(u,steps,h,t,N);
  if((counter>10) && (Math.abs(t-2.0*Math.PI*counter/Omega)<0.02))
  {
  int m = ((int)(10.0*u[0])+350);  int n = ((int)(40.0*u[1])+200);
  g.drawLine(m,n,m,n);
  }
  if(t > 2.0*Math.PI*counter/Omega) { counter++; }
  }
  }
  public static void main(String[] args)
  {
  Frame f = new PendulumPoincare(); f.setVisible(true);
  }
}

评分

1

查看全部评分

回复
分享到:

使用道具 举报

发表于 2011-5-4 13:50 | 显示全部楼层
钟摆系统的庞加莱截面程序,感谢liliangbiao分享,只是由于语言的差异看不太懂,希望有人出来解释一下,不知道与论坛上已有的matlab程序在原理上有什么不同?
发表于 2011-5-5 09:33 | 显示全部楼层
liliangbiao先生用java写的,map函数不太明白,太多赋值语句了,如果做映射应该在paint函数里面吧,但是不太清楚,还是请别的高手路过吧!
发表于 2011-6-10 17:07 | 显示全部楼层
没有学过JAVA呢,看您的程序,只能了解您编程的思想,但是还是很受用的。试着用MATLAB实现您这一思想。
 楼主| 发表于 2011-6-11 00:03 | 显示全部楼层
这就对了,只需要了解编程思想就可以了,试试用Matlab或者其他语言编写一下,应该不难理解的!编写对了,欢迎共享!
发表于 2011-12-10 23:30 | 显示全部楼层
调试的时候,我只有半个图,是不是我开的窗口太小了?
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-7 03:30 , Processed in 0.052109 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表