声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3293|回复: 3

[经典算法] 请教Newmark方法C++程序?谢谢!

[复制链接]
发表于 2007-7-27 10:25 | 显示全部楼层 |阅读模式

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

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

x
谁有Newmark方法C++程序,做课题急用,请大虾指点一下,邮箱tianyarrrbbb@163.com

本帖被以下淘专辑推荐:

回复
分享到:

使用道具 举报

发表于 2007-7-29 15:32 | 显示全部楼层
http://sokocalo.engr.ucdavis.edu ... penSees_source_.tgz

[ 本帖最后由 风花雪月 于 2007-7-29 15:35 编辑 ]
发表于 2007-8-3 17:40 | 显示全部楼层
  1. #include<iostream.h>
  2. #include<iomanip.h>

  3. void ArrayMVector(double**,double*,double*,int);
  4. void ArrayLU(double**,double**,double**,int);
  5. void Inverse(double**,double**,int);
  6. void LUSolve(double**,double**,double*,double*,int);
  7. void Newmark(double**,double**,double**,double*,double**,double**,double**,int,int,double);

  8. void main()
  9. {
  10.         int i,j,n,nt;
  11.     n=2;nt=100;
  12.         double dt=0.08;
  13.         double **M=new double*[n];
  14.         for(i=0;i<n;i++)
  15.                 M[i]=new double[n];
  16.     double **C=new double*[n];
  17.         for(i=0;i<n;i++)
  18.                 C[i]=new double[n];
  19.     double **K=new double*[n];
  20.         for(i=0;i<n;i++)
  21.                 K[i]=new double[n];
  22.     double **X=new double*[nt+1];
  23.         for(i=0;i<nt+1;i++)
  24.                 X[i]=new double[n];
  25.     double **V=new double*[nt+1];
  26.         for(i=0;i<nt+1;i++)
  27.                 V[i]=new double[n];
  28.     double **A=new double*[nt+1];
  29.         for(i=0;i<nt+1;i++)
  30.                 A[i]=new double[n];
  31.         double *P=new double[n];
  32.         X[0][0]=0;X[0][1]=0;
  33.         V[0][0]=0;V[0][1]=0;
  34.         A[0][0]=0;A[0][1]=2;
  35.         M[0][0]=1;M[0][1]=0;M[1][0]=0;M[1][1]=1;
  36.     C[0][0]=0;C[0][1]=0;C[1][0]=0;C[1][1]=0;
  37.     K[0][0]=0;K[0][1]=-1;K[1][0]=1;K[1][1]=0;
  38.         P[0]=0;P[1]=2;
  39.     Newmark(M,C,K,P,X,V,A,n,nt,dt);
  40.         for(i=0;i<=nt;i++)
  41.         {
  42.         cout<<i*dt<<" s:"<<endl;
  43.                 for(j=0;j<n;j++)
  44.                 cout<<setw(12)<<X[i][j]<<setw(12)<<V[i][j]<<setw(12)<<A[i][j]<<endl;
  45.         }
  46. }


  47. //***************************************************************************************************
  48. //*************                                Newmark                                  *************
  49. //***************************************************************************************************
  50. void Newmark(double**M,double**C,double**K,double *P,double**X,double**V,double**A,int size,int nt,double dt)
  51. {
  52.         int ti,i,j;
  53.     double a=0.25,d=0.5;
  54.         double a0,a1,a2,a3,a4,a5,a6,a7;
  55.         double *PT=new double[size];
  56.     double *temp=new double[size];
  57.     double *tran=new double[size];
  58.     double **KK=new double*[size];
  59.         for(i=0;i<size;i++)
  60.                 KK[i]=new double[size];
  61.     double **L=new double* [size];
  62.         for(i=0;i<size;i++)
  63.                 L[i]=new double [size];
  64.     double **U=new double* [size];
  65.         for(i=0;i<size;i++)
  66.                 U[i]=new double [size];

  67.     a0=1/(a*dt*dt);
  68.         a1=d/(a*dt);
  69.         a2=1/(a*dt);
  70.         a3=1/(2*a)-1;
  71.         a4=d/a-1;
  72.         a5=dt*(d/a-2)/2;
  73.         a6=dt*(1-d);
  74.         a7=d*dt;
  75.         for(i=0;i<size;i++)
  76.         {
  77.                 for(j=0;j<size;j++)
  78.                         KK[i][j]=K[i][j]+a0*M[i][j]+a1*C[i][j];
  79.         }
  80.     ArrayLU(KK,L,U,size);//LU Reduce
  81.         for(ti=1;ti<=nt;ti++)
  82.         {
  83.                 for(i=0;i<size;i++)
  84.                         temp[i]=a0*X[ti-1][i]+a2*V[ti-1][i]+a3*A[ti-1][i];
  85.         ArrayMVector(M,temp,tran,size);
  86.                 for(i=0;i<size;i++)
  87.                         PT[i]=P[i]+tran[i];
  88.         for(i=0;i<size;i++)
  89.                         temp[i]=a1*X[ti-1][i]+a4*V[ti-1][i]+a5*A[ti-1][i];
  90.         ArrayMVector(C,temp,tran,size);
  91.                 for(i=0;i<size;i++)
  92.                         PT[i]=PT[i]+tran[i];
  93.                 LUSolve(L,U,PT,temp,size);
  94.                 for(i=0;i<size;i++)
  95.                 {
  96.                         X[ti][i]=temp[i];
  97.                         A[ti][i]=a0*(X[ti][i]-X[ti-1][i])-a2*V[ti-1][i]-a3*A[ti-1][i];
  98.                         V[ti][i]=V[ti-1][i]+a6*A[ti-1][i]+a7*A[ti][i];
  99.                 }
  100.         }
  101.         for(i=0;i<size;i++)
  102.                 delete [] KK[i];
  103.         delete []KK;
  104.     for(i=0;i<size;i++)
  105.                 delete [] L[i];
  106.         delete []L;
  107.     for(i=0;i<size;i++)
  108.                 delete [] U[i];
  109.         delete []U;
  110.         delete []PT;
  111.         delete []temp;
  112.         delete []tran;
  113. }



  114. //***************************************************************************************************
  115. //***************************************************************************************************

  116. //***************************************************************************************************
  117. //*************                            LU Reduce of Array                           *************
  118. //***************************************************************************************************
  119. void LUSolve(double**L,double**U,double*P,double*X,int size)
  120. {
  121.         int i,j;
  122.         double sum;
  123.         double* Y=new double[size];
  124.     Y[0]=P[0]/L[0][0];
  125.     for(i=1;i<size;i++)
  126.         {
  127.         sum=0;
  128.                 for(j=0;j<i;j++)
  129.                         sum+=L[i][j]*Y[j];
  130.                 Y[i]=(P[i]-sum)/L[i][i];
  131.         }
  132.     X[size-1]=Y[size-1]/U[size-1][size-1];
  133.         for(i=size-2;i>=0;i--)
  134.         {
  135.                 sum=0;
  136.                 for(j=i+1;j<size;j++)
  137.                         sum+=U[i][j]*X[j];
  138.                 X[i]=(Y[i]-sum)/U[i][i];
  139.         }
  140.         delete []Y;
  141. }

  142. //***************************************************************************************************
  143. //***************************************************************************************************






  144. //***************************************************************************************************
  145. //*************                            LU Reduce of Array                           *************
  146. //***************************************************************************************************
  147. void ArrayLU(double**A,double**L,double**U,int size)
  148. {
  149.     int i,j,k;
  150.         double scale;
  151.     double **B=new double* [size];
  152.         for(i=0;i<size;i++)
  153.                 B[i]=new double [size];
  154.     for(i=0;i<size;i++)
  155.         {
  156.                 for(j=0;j<size;j++)
  157.                 {
  158.                         B[i][j]=0;L[i][j]=0;U[i][j]=0;
  159.                 }
  160.         B[i][i]=1;
  161.         }
  162.         for(i=0;i<size-1;i++)
  163.         {
  164.                 if(A[i][i]==0)
  165.                 {
  166.                         cout<<"the Array is singular"<<endl;
  167.                 }
  168.                 for(j=i+1;j<size;j++)
  169.                 {
  170.                         scale=A[j][i]/A[i][i];
  171.                         for(k=i;k<size;k++)
  172.                                 A[j][k]=A[j][k]-A[i][k]*scale;
  173.                         for(k=0;k<size;k++)
  174.                                 B[j][k]=B[j][k]-B[i][k]*scale;
  175.                 }
  176.         }
  177.         Inverse(B,L,size);
  178.         for(i=0;i<size;i++)
  179.         {
  180.                 for(j=i;j<size;j++)
  181.                         U[i][j]=A[i][j];
  182.         }
  183.         for(i=0;i<size;i++)
  184.                 delete [] B[i];
  185.         delete []B;
  186. }
  187. //***************************************************************************************************
  188. //***************************************************************************************************




  189. //***************************************************************************************************
  190. //******************                         Array Inverse                         ******************
  191. //***************************************************************************************************
  192. void Inverse(double**A,double**B,int size)
  193. {
  194.         int i,j,k;
  195.         double scale;
  196.         for(i=0;i<size;i++)
  197.                 B[i][i]=1;
  198.         for(i=0;i<size-1;i++)
  199.         {
  200.                 if(A[i][i]==0)
  201.                 {
  202.                         cout<<"the Array is singular"<<endl;
  203.                 }
  204.                 for(j=i+1;j<size;j++)
  205.                 {
  206.                         scale=A[j][i]/A[i][i];
  207.                         for(k=i;k<size;k++)
  208.                                 A[j][k]=A[j][k]-A[i][k]*scale;
  209.                         for(k=0;k<size;k++)
  210.                                 B[j][k]=B[j][k]-B[i][k]*scale;
  211.                 }
  212.         }
  213.         for(i=size-1;i>0;i--)
  214.         {
  215.                 for(k=0;k<size;k++)
  216.                         B[i][k]=B[i][k]/A[i][i];
  217.                 A[i][i]=1;
  218.                 for(j=i-1;j>=0;j--)
  219.                 {
  220.                         scale=A[j][i]/A[i][i];
  221.                         A[j][i]=0;
  222.             for(k=0;k<size;k++)
  223.                                 B[j][k]=B[j][k]-B[i][k]*scale;
  224.                 }
  225.         }
  226.         for(k=0;k<size;k++)
  227.                 B[0][k]=B[0][k]/A[0][0];
  228. }
  229. //***************************************************************************************************
  230. //***************************************************************************************************




  231. //***************************************************************************************************
  232. //******************                      Array Multiply Vector                    ******************
  233. //***************************************************************************************************
  234. void ArrayMVector(double **A,double *X,double *B,int size)
  235. {
  236.         for(int i=0;i<size;i++)
  237.         {
  238.                 B[i]=0;
  239.                 for(int j=0;j<size;j++)
  240.                 {
  241.                         B[i]+=A[i][j]*X[j];
  242.                 }
  243.         }
  244. }
  245. //***************************************************************************************************
  246. //***************************************************************************************************
复制代码

[ 本帖最后由 风花雪月 于 2007-9-3 09:51 编辑 ]

评分

1

查看全部评分

发表于 2011-11-27 11:09 | 显示全部楼层
有具体详细简单的这方面的程序吗?希望高人指点
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-12-23 09:35 , Processed in 0.068423 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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