📄 unit1.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include <math.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
void Euler(float *x,float *y);
double X[20000],Y[20000],Xf[20000],Zs[20000],s[20000];
double Pli[20000],Pli2[20000],Pli3[20000];
int ti=0;
float pi=3.1415926;
float h=0.025; //振动频率
float k=0.5; //阻尼系数
double f=0.497658062565; //策动力 f=0.49765814842; f=0.49765814843;
double a=0.00000000001,fk=0.000000000001,Zk=0.0001;
int i,x0,y0,jj=0;
float e1,e2,e3,e4,e5,e6;
float w=1,t=0;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Edit9->Text=h;
Edit10->Text=k;
Edit11->Text=f;
Edit12->Text=a;
Edit13->Text=0;//-0.21;
Edit14->Text=0;//0.02;
Edit15->Text=1.0;
Edit18->Text=Zk;
Edit19->Text=fk;
h=StrToFloat(Edit9->Text);
k=StrToFloat(Edit10->Text);
f=StrToFloat(Edit11->Text);
fk=StrToFloat(Edit19->Text);
a=StrToFloat(Edit12->Text);
w=StrToFloat(Edit15->Text);
X[0]=StrToFloat(Edit13->Text);
Y[0]=StrToFloat(Edit14->Text);
Zk=StrToFloat(Edit18->Text);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
int cy=0,cys=3000;
int kh=0;
float t1,t2,t11,t22;
while(cy<cys){
i=cy;
//t=cy/31.415926;
t=cy/62.831852; //ok!
// t=cy/15.707963;
s[cy]=cos(w*t); //sin(w*t);
Zs[cy]=1-(rand()%1000)/500.0; // // Zs[cy]=rand()/10000.0;//
if( Zs[cy]>=1) Zs[cy]=1;
if( Zs[cy]<=-1) Zs[cy]=-1;
Xf[cy]=cos(w*t); // t=0,step 0.001 50*pi 157079.63
X[i+1]=h*Y[i]+X[i];
t1=h*Y[i]+X[i];
// t11=h*((-k)*Y[i]+X[i]-pow(X[i],3))+Y[i]; // +a*s[i]+Zs[i]+Y[i] +f*cos(2*pi*500*cy
t11=h*((-k)*Y[i]+X[i]-pow(X[i],3)+f*Xf[i]+a*s[i]+Zk*Zs[i])+Y[i];
// Y[i+1]=h*((-k)*Y[i]+X[i]-pow(X[i],3)+f*Xf[i]+a*s[i]+Zs[i]+Y[i]);
t2=h*t11+X[i];
t22=h*((-k)*t11+t1-pow(t1,3)+f*Xf[i+1]+a*s[i+1]+Zk*Zs[i+1])+Y[i]; // +f*cos(2*pi*500*(cy+1))
X[i+1]=(t1+t2)/2.0;
Y[i+1]=(t11+t22)/2.0 ;
x0=X[i]*100+200;y0=-Y[i]*100+200;
Canvas->Pixels[x0][y0] = clRed;
// f+=0.00001;
Edit1->Text=e1;
Edit2->Text=e2;
Edit3->Text=e3;
Edit4->Text=e4;
Edit5->Text=h;
Edit6->Text=x0;
Edit7->Text=y0;
//-----------------------------------------------------------------
cy++;
}
Canvas->MoveTo(0,200);
Canvas->LineTo(400,200);
Canvas->MoveTo(200,0);
Canvas->LineTo(200,400);
Canvas->MoveTo(100,0);
Canvas->LineTo(100,400);
Canvas->MoveTo(300,0);
Canvas->LineTo(300,400);
//========================================
Series1->Clear();
Series2->Clear();
Series3->Clear();
// Series4->Clear();
for(kh=0;kh<3000;kh++){
if(CheckBox3->Checked==true){Series1->Add(X[kh]*10,1,clRed);} //显示立压
if(CheckBox4->Checked==true){Series2->Add(Y[kh]*10,1,clBlue);} //显示套压
if(CheckBox5->Checked==true){Series3->Add(2*Zs[kh],1,clYellow);} //显示相位差
// if(CheckBox6->Checked==true){Series4->Add(Zs[kh]*10,1,clGreen);}
}
ti++;
if(ti>3000) {ti=0; }
if(jj==0){ f+=0; if(f>2) {f=2;} }
if(jj==1){ f-=fk; if(f<0.2) {f=0.2;} }
if(jj==2){ f+=fk; if(f>2) {f=2;} }
Edit16->Text=f;
Edit17->Text=Zk*Zs[3000];
Refresh();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Timer1->Enabled =true; //hkljnkjln
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Timer1->Enabled =false;
}
//---------------------------------------------------------------------------
// 对于应用改进的Euler方法求系统输出的前三点值的C代码
//(h,k,f,a为已知系统参数):
void Euler(float *x,float *y){
int i;
float t1,t2,t11,t22;
for(i=0;i<3;i++){
t1=h*y[i]+x[i]; //x=wy
t11=h*((-k)*y[i]+x[i]-pow(x[i],3)+f*Xf[i]+a*s[i]+Zs[i]+y[i]);
t2=h*t11+x[i];
t22=y[i]+h*((-k)*t11+t1-pow(t1,3)+f*Xf[i+1]+a*s[i+1]+Zs[i+1]);
x[i+1]=(t1+t2)/2;
y[i+1]=(t11+t22)/2;
}
e1=x[0]; e2=y[0];
e3=x[1]; e4=y[1];
e5=x[2]; e6=y[2];
}
/*
void Euler(float *x,float *y){
int i;
float t1,t2,t11,t22;
for(i=0;i<3;i++){
t1=h*y[i]+x[i]; //x=wy
t11=h*((-k)*y[i]+x[i]-pow(x[i],3)+f*Xf[i]+a*s[i]+Zs[i]+y[i]);
t2=h*t11+x[i];
t22=y[i]+h*((-k)*t11+t1-pow(t1,3)+f*Xf[i+1]+a*s[i+1]+Zs[i+1]);
x[i+1]=(t1+t2)/2;
y[i+1]=(t11+t22)/2;
}
}
*/
void __fastcall TForm1::Button3Click(TObject *Sender)
{
h=StrToFloat(Edit9->Text);
k=StrToFloat(Edit10->Text);
f=StrToFloat(Edit11->Text);
fk=StrToFloat(Edit19->Text);
a=StrToFloat(Edit12->Text);
w=StrToFloat(Edit15->Text);
X[0]=StrToFloat(Edit13->Text);
Y[0]=StrToFloat(Edit14->Text);
Zk=StrToFloat(Edit18->Text);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
h=0.29; //振动频率
k=0.5; //阻尼系数
f=7.5; //策动力
a=0.01;
w=0.2;
X[0]=-0.21;
Y[0]=0.02;
Edit9->Text=h;
Edit10->Text=k;
Edit11->Text=f;
Edit12->Text=a;
Edit13->Text=-0.21;
Edit14->Text=0.02;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
Refresh();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button6Click(TObject *Sender)
{
jj=0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button7Click(TObject *Sender)
{
jj=1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button8Click(TObject *Sender)
{
jj=2;
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -