⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sprfft.cpp

📁 c++的数学物理方程数值算法源程序。这是"Numerical Methods for Physics"第二版的源程序。
💻 CPP
字号:
// sprfft - Program to compute the power spectrum of a  // coupled mass-spring system.#include "NumMeth.h"void sprrk(double x[], double t, double param[], double deriv[]);void rk4( double x[], int nX, double t, double tau, 
  void (*derivsRK)(double x[], double t, double param[], double deriv[]), 
  double param[]);void fft( Matrix& RealA, Matrix& ImagA);
         void main() {  //* Set parameters for the system (initial positions, etc.).
  const int nState = 6;  Matrix x(3), v(3); double state[nState+1];  cout << "Enter initial displacement of:" << endl;  cout << "  Mass #1 = "; cin >> x(1);  cout << "  Mass #2 = "; cin >> x(2);  cout << "  Mass #3 = "; cin >> x(3);  v(1) = 0.0; v(2) = 0.0; v(3) = 0.0; // Masses are initially at rest  state[1] = x(1);  state[2] = x(2);  state[3] = x(3);  state[4] = v(1);  state[5] = v(2);  state[6] = v(3);  cout << "Enter timestep: "; double tau; cin >> tau;    double k_over_m = 1;      // Ratio of spring const. over mass  double param[1+1]; param[1] = k_over_m;  //* Loop over the desired number of time steps.  double time = 0;       // Set initial time  int nStep = 256;       // Number of steps in the main loop  int nprint = nStep/8;  // Number of steps between printing progress  Matrix xplot(nStep,3), tplot(nStep);  // Plotting variables
  int i, iStep;  for( iStep=1; iStep<=nStep; iStep++ ) {     //* Use Runge-Kutta to find new displacements of the masses.    rk4(state,nState,time,tau,sprrk,param);      time = time + tau;          //* Record the positions for graphing and to compute spectra.    xplot(iStep,1) = state[1];   // Record positions    xplot(iStep,2) = state[2];  xplot(iStep,3) = state[3];    tplot(iStep) = time;    if( (iStep%nprint) < 1 )      cout << "Finished " << iStep << " out of " <<                              nStep << " steps" << endl;  }  //* Calculate the power spectrum of the time series for mass #1  Matrix f(nStep), x1fftR(nStep), x1fftI(nStep), spect(nStep);  for( i=1; i<=nStep; i++ ) {    f(i) = (i-1)/(tau*nStep);      // Frequency    double x1 = xplot(i,1);        // Displacement of mass 1    x1fftR(i) = x1;    x1fftI(i) = 0.0;     // Copy data for input to fft  }  fft(x1fftR, x1fftI);         // Fourier transform of displacement  for( i=1; i<=nStep; i++ )    // Power spectrum of displacement    spect(i) = x1fftR(i)*x1fftR(i) + x1fftI(i)*x1fftI(i);           //* Apply the Hanning window to the time series and calculate  //  the resulting power spectrum  double window, pi = 3.141592654;  Matrix x1fftRw(nStep), x1fftIw(nStep), spectw(nStep);  for( i=1; i<=nStep; i++ ) {    window = 0.5*(1.0-cos(2.0*pi*(i-1.0)/nStep)); // Hanning window    double x1w = xplot(i,1) * window;      // Windowed time series    x1fftRw(i) = x1w;    x1fftIw(i) = 0.0;     // Copy data for input to fft  }  fft(x1fftRw, x1fftIw);            // Fourier transf. (windowed data)  for( i=1; i<=nStep; i++ )    // Power spectrum (windowed data)    spectw(i) = x1fftRw(i)*x1fftRw(i) + x1fftIw(i)*x1fftIw(i);                 //* Print out the plotting variables:   //    tplot, xplot, f, spect, spectw  ofstream tplotOut("tplot.txt"), xplotOut("xplot.txt"), fOut("f.txt"), 
	       spectOut("spect.txt"), spectwOut("spectw.txt");  for( i=1; i<=nStep; i++ ) {    tplotOut << tplot(i) << endl;    xplotOut << xplot(i,1) << ", " << xplot(i,2) << ", "             << xplot(i,3) << endl;    fOut << f(i) << endl;    spectOut << spect(i) << endl;    spectwOut << spectw(i) << endl;  }}/***** To plot in MATLAB; use the script below ********************load tplot.txt; load xplot.txt; load f.txt; load spect.txt; load spectw.txtnstep = length(tplot);  nprint = nstep/8;%* Graph the displacements of the three masses.figure(1); clf;  % Clear figure 1 window and bring forwardipr = 1:nprint:nstep;  % Used to graph limited number of symbolsplot(tplot(ipr),xplot(ipr,1),'o',tplot(ipr),xplot(ipr,2),'+',...     tplot(ipr),xplot(ipr,3),'*',...     tplot,xplot(:,1),'-',tplot,xplot(:,2),'-.',...     tplot,xplot(:,3),'--');legend('Mass #1','Mass #2','Mass #3');title('Displacement of masses (relative to rest positions)');xlabel('Time'); ylabel('Displacement');%* Graph the power spectra for original and windowed datafigure(2); clf;  % Clear figure 2 window and bring forwardsemilogy(f(1:(nstep/2)),spect(1:(nstep/2)),'-',...         f(1:(nstep/2)),spectw(1:(nstep/2)),'--');title('Power spectrum (dashed is windowed data)');xlabel('Frequency'); ylabel('Power');******************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -