|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
一种经典的结构动力特性数值分析方法。
总的来说,就是首先通过理论推导构造出递推式:
{实际振型} = f({实际振型});//这里,f(x)实际上是一个四次积分。
然后假设一个振型,带入递推式,具体为:
- 任意给定{假设振型};
-
- while( abs({修正振型} - {假设振型}) < 1e-5)
- {
- {修正振型} = f({假设振型});
-
- {假设振型} = {修正振型} ;
- }
复制代码
递推式是根据欧拉梁横向振动方程得到的,以公式居多,就作为附件吧(附件[理论基础.doc]即是)。
某变截面梁的前三阶振型:
还是挺像回事儿的哈。
PS:附件[计算结果.doc]是根据本文代码中硬编码的梁模型计算得到的结果。
源代码是:
- // VibrateStyle.cpp : 定义控制台应用程序的入口点。
- // 结构·第三·振型计算
- #include "stdafx.h"
- #include <iostream>
- #include <iomanip>
- #include <fstream>
- #include <math.h>
- /********************宏,命名空间*****************/
- #define MAXNUM 11
- #define STOPLINE 0.000001
- #define SHOW_DETAIL
- #define OUTPUT(K) cout<<"****结果****"<<endl;\
- cout<<K<<"阶共振 "<<w##K<<endl;for(int i=0;i<MAXNUM;++i){cout<<Shape_##K[i]<<endl;}
- using namespace std;
- /***********************常量表********************/
- //密度
- const double Dens=2850;
- //弹性模量
- const double E=71.54e9;
- //截面惯性矩
- const double I[MAXNUM]=
- {
- 0.0279e-8,0.0212e-8,0.0157e-8,0.0108e-8,0.0084e-8,
- 0.0061e-8,0.0045e-8,0.0037e-8,0.0032e-8,0.0030e-8,
- 0.0030e-8
- };
- //截面面积
- const double A[MAXNUM]=
- {
- 1.70e-4,1.46e-4,1.26e-4,1.09e-4,0.96e-4,
- 0.86e-4,0.77e-4,0.73e-4,0.70e-4,0.68e-4,
- 0.68e-4
- };
- //截面相对积分步长
- const double dx=0.01;
- //共振频率
- double w1,w2,w3;
- //各阶振型数据
- double Shape_1[MAXNUM];
- double Shape_2[MAXNUM];
- double Shape_3[MAXNUM];
- /********************函数声明区*******************/
- bool IfStop(double PreY[MAXNUM],double NextY[MAXNUM]);//收敛判据
- double Integral(int k,double PreY[MAXNUM]);//四重积分
- void Comp(void (*f_Adjust)(double NextY[MAXNUM]),double Shape[MAXNUM],double &w);//计算振型的函数
- void Adjust_2ndorder(double NextY[MAXNUM]);//二阶振型的调整函数
- void Adjust_3rdorder(double NextY[MAXNUM]);//三阶振型的调整函数
- int _tmain(int argc, _TCHAR* argv[])
- {
- //打开文件等等
- ofstream OutPutFile;
- OutPutFile.open("re.plt",ios::out);
- /*********计算并输出到屏幕***********/
- Comp(NULL,Shape_1,w1);OUTPUT(1)
- Comp(Adjust_2ndorder,Shape_2,w2);OUTPUT(2)
- Comp(Adjust_3rdorder,Shape_3,w3);OUTPUT(3)
- /**********结果记录到文件************/
- OutPutFile<<"第一阶"<<endl;
- for(int i=0;i<MAXNUM;++i)
- OutPutFile<<0.1*i<<" "<<Shape_1[i]<<endl;
- OutPutFile<<"第二阶"<<endl;
- for(int i=0;i<MAXNUM;++i)
- OutPutFile<<0.1*i<<" "<<Shape_2[i]<<endl;
- OutPutFile<<"第三阶"<<endl;
- for(int i=0;i<MAXNUM;++i)
- OutPutFile<<0.1*i<<" "<<Shape_3[i]<<endl;
- system("pause");
- OutPutFile.close();
- return 0;
- }
- void Comp(void (*f_Adjust)(double NextY[MAXNUM]),double Shape[MAXNUM],double &w)
- {
- //初始振型
- double PreY[MAXNUM]={0.1,0.1,0.1,0.1,0.1,0,1};
- //迭代振型
- double NextY[MAXNUM]={0.0};
- while(1)
- {
- #ifdef SHOW_DETAIL
- cout<<"****Test****"<<endl;
- for(int i=0;i<MAXNUM;++i)
- cout<<PreY[i]<<endl;
- system("pause");
- system("cls");
- #endif
- //计算四重积分
- for(int i=0;i<MAXNUM;++i)
- NextY[i]=Integral(i,PreY);
- //归一化
- for(int i=0;i<MAXNUM;++i)
- NextY[i]=NextY[i]/NextY[MAXNUM-1];
- //根据正交条件调整
- if(f_Adjust)
- f_Adjust(NextY);
- //判断收敛
- if(!IfStop(PreY,NextY))
- break;
- //迭代
- for(int i=0;i<MAXNUM;++i)
- PreY[i]=NextY[i];
- }
- //记录当前收敛解
- for(int i=0;i<MAXNUM;++i)
- PreY[i]=NextY[i];
- //计算共振频率
- w=pow(E/Dens/Integral(MAXNUM-1,PreY),0.5);
- //记录到全局变量
- for(int i=0;i<MAXNUM;++i)
- Shape[i]=NextY[i];
- }
- bool IfStop(double PreY[MAXNUM],double NextY[MAXNUM])
- {
- double Sum=0;
- for(int i=0;i<MAXNUM;++i)
- Sum+=pow(PreY[i]-NextY[i],2);
- if(pow(Sum,0.5)<STOPLINE)
- return false;//停止迭代
- return true;//继续迭代
- }
- double Integral(int k,double PreY[MAXNUM])
- {
- int i,j,p,q;
- double Sum_1=0,Sum_2=0,Sum_3=0,Sum_4=0;
- i=j=p=q=1;
- for(q=1;q<=k;++q)
- {
- Sum_2=0;
- for(p=1;p<=q;++p)
- {
- Sum_3=0;
- for(j=p;j<MAXNUM;++j)
- {
- Sum_4=0;
- for(i=j;i<MAXNUM;++i)
- {
- Sum_4+=A[i]*PreY[i]*dx;
- }
- Sum_3+=Sum_4*dx;
- }
- Sum_2+=Sum_3/I[p]*dx;
- }
- Sum_1+=Sum_2*dx;
- }
- return Sum_1;
- }
- void Adjust_2ndorder(double NextY[MAXNUM])
- {
- double C12=0,B11=0,a1;
- for(int i=1;i<MAXNUM;++i)
- {
- C12+=A[i]*NextY[i]*Shape_1[i];
- B11+=A[i]*Shape_1[i]*Shape_1[i];
- }
- a1=C12/B11;
- for(int i=0;i<MAXNUM;++i)
- {
- NextY[i]=NextY[i]-a1*Shape_1[i];
- }
- return;
- }
- void Adjust_3rdorder(double NextY[MAXNUM])
- {
- double C13=0,C23=0,B11=0,B22=0,a1,a2;
- for(int i=1;i<MAXNUM;++i)
- {
- C13+=A[i]*NextY[i]*Shape_1[i];
- C23+=A[i]*NextY[i]*Shape_2[i];
- B11+=A[i]*Shape_1[i]*Shape_1[i];
- B22+=A[i]*Shape_2[i]*Shape_2[i];
- }
- a1=C13/B11;
- a2=C23/B22;
- for(int i=0;i<MAXNUM;++i)
- {
- NextY[i]=NextY[i]-a1*Shape_1[i]-a2*Shape_2[i];
- }
- return;
- }
复制代码
|
|