- フーリエ変換1
#include <fstream>
#include <iostream>
#include <math.h>
#include <time.h>
using namespace std;
#define PI 3.1415
double x(double t,double A[],double B[],double w);
int main(){
int i,n;
double j,l,dx,xa,xb,w;
double N;
double a[5],b[5],sa[6],sb[6];
srand((unsigned int) time(NULL));
for(i=0;i<5;i++){
a[i]=rand()%100+1.0;
b[i]=rand()%100+1.0;
}
w=(double)((rand()%50)/50.0+0.01);
for(i=0;i<=5;i++) {
sa[i]=0.0;
sb[i]=0.0;
}
ofstream out("fourier1.txt");
for(j=10.0;j<=10.0+6.0*PI/w;j+=0.01){
out << j<<' '<<x(j,a,b,w)<<endl;
}
out.close();
cout <<"角速度:"<<w<<endl;
cout<<"周期:"<<2*PI/w<<endl;
cout <<"x(10.0): "
<<x(10.0,a,b,w)<<endl
<<"=x(10.0+"<<2*PI/w<<"): "
<<x(10.0+2*PI/w,a,b,w)<<endl;
l=PI/w;
N=1000.0/w;
dx=2*l/N;
for(n=1;n<=5;n++){
for(j=0.0;j<N;j++) {
xa=10.0+dx*j;
xb=10.0+dx*(j+1.0);
sa[n]+=(x(xa,a,b,w)*cos(n*PI*xa/l)+x(xb,a,b,w)*cos(n*PI*xb/l))*dx/2.0;
}
}
for(n=1;n<=5;n++){
for(j=0.0;j<N;j++) {
xa=10.0+dx*j;
xb=10.0+dx*(j+1);
sb[n]+=(x(xa,a,b,w)*sin(n*PI*xa/l)+x(xb,a,b,w)*sin(n*PI*xb/l))*dx/2.0;
}
}
cout <<"-------フーリエ変換によるa[i]----------"<<endl;
for(n=1;n<=5;n++) {
cout <<"a["<<n<<"]="<<sa[n]/l<<endl;
}
cout <<"-------実際のa[i]---------"<<endl;
for(i=0;i<5;i++){
cout << "a[" << i+1 << "]=" << a[i] <<endl;
}
cout <<"-------フーリエ変換によるb[i]----------"<<endl;
for(n=1;n<=5;n++) {
cout <<"b["<<n<<"]="<<sb[n]/l<<endl;
}
cout <<"-------実際のb[i]---------"<<endl;
for(i=0;i<5;i++){
cout << "b[" << i+1 << "]=" << b[i] <<endl;
}
return 0;
}
double x(double t,double A[],double B[],double w){ //x(t)
int i;
double k=0.0;
for(i=1;i<=5;i++){
k+=A[i-1]*cos(i*w*t)+B[i-1]*sin(i*w*t);
}
return (k);
}
- フーリエ変換2
#include <fstream>
#include <iostream>
#include <math.h>
#include <time.h>
using namespace std;
#define PI 3.1415
double x(double t,double A[],double B[],double w,double r[]);
int main(){
int i;
double j,k,dx,xa,xb,w,sum;
double N;
double a[3],b[3],r[3];
srand((unsigned int) time(NULL));
for(i=0;i<3;i++){
a[i]=rand()%100+1.0;
b[i]=rand()%100+1.0;
r[i]=(double)((rand()%50)/50.0+0.1);
cout <<"r["<<i+1<<"]="<<r[i]<<endl;
}
w=(double)((rand()%50)/80.0+1);
ofstream out1("fourier1.txt");
for(j=0;j<=4.0*PI/w;j+=0.02){
out1 << j<<' '<<x(j,a,b,w,r)<<endl;
}
out1.close();
cout <<"角速度:"<<w<<endl;
N=pow(10.0,4);
dx=0.01;
ofstream out2("fourier2.txt");
//フーリエ余弦変換
for(k=0;k<=6.0;k+=0.02){
sum=0.0;
for(j=0.0;j<N;j+=1.0) {
xa=0+dx*j;
xb=0+dx*(j+1.0);
sum+=(x(xa,a,b,w,r)*cos(k*xa)+x(xb,a,b,w,r)*cos(k*xb))*dx/2.0;
}
sum*=pow(2.0/PI,0.50);
out2<<k<<' '<<sum<<endl;
}
out2.close();
ofstream out3("fourier3.txt");
//フーリエ正弦変換
for(k=0;k<=6;k+=0.02){
sum=0.0;
for(j=0.0;j<N;j+=1.0) {
xa=0+dx*j;
xb=0+dx*(j+1.0);
sum+=(x(xa,a,b,w,r)*sin(k*xa)+x(xb,a,b,w,r)*sin(k*xb))*dx/2.0;
}
sum*=pow(2.0/PI,0.50);
out3<<k<<' '<<sum<<endl;
}
out3.close();
return 0;
}
double x(double t,double A[],double B[],double w,double r[]){ //x(t)
int i;
double k=0.0;
for(i=1;i<=3;i++){
k+=A[i-1]*exp(-r[i-1]*t)*cos(i*w*t)+B[i-1]*exp(-r[i-1]*t)*sin(i*w*t);
}
return (k);
}