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

📄 orbit.cpp

📁 c++的数学物理方程数值算法源程序。这是"Numerical Methods for Physics"第二版的源程序。
💻 CPP
字号:
// orbit - Program to compute the orbit of a comet.#include "NumMeth.h"void gravrk( 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 rka( double x[], int nX, double& t, double& tau, double err,  void (*derivsRK)(double x[], double t, double param[], double deriv[]), 
  double param[]);                  void main() {  //* Set initial position and velocity of the comet.  double r0, v0;  cout << "Enter initial radial distance (AU): "; cin >> r0;    cout << "Enter initial tangential velocity (AU/yr): "; cin >> v0;  double r[2+1], v[2+1], state[4+1], accel[2+1];  r[1] = r0; r[2] = 0;  v[1] = 0; v[2] = v0;  state[1] = r[1]; state[2] = r[2];   // Used by R-K routines  state[3] = v[1]; state[4] = v[2];
  int nState = 4;  // Number of elements in state vector  //* Set physical parameters (mass, G*M)  const double pi = 3.141592654;  double GM = 4*pi*pi;      // Grav. const. * Mass of Sun (au^3/yr^2)  double param[1+1];  param[1] = GM;  double mass = 1.;         // Mass of comet   double adaptErr = 1.e-3;  // Error parameter used by adaptive Runge-Kutta  double time = 0;  //* Loop over desired number of steps using specified  //  numerical method.  cout << "Enter number of steps: ";   int nStep;  cin >> nStep;  cout << "Enter time step (yr): ";  double tau;  cin >> tau;   cout << "Choose a numerical method:" << endl;  cout << "1) Euler,       2) Euler-Cromer, "	<< endl
	   << "3) Runge-Kutta, 4) Adaptive R-K: ";  int method;  cin >> method;  double *rplot, *thplot, *tplot, *kinetic, *potential;  // Plotting variables  rplot = new double [nStep+1];  thplot = new double [nStep+1];  tplot = new double [nStep+1];  kinetic = new double [nStep+1]; potential = new double [nStep+1];
  int iStep;  for( iStep=1; iStep<=nStep; iStep++ ) {      //* Record position and energy for plotting.    double normR = sqrt( r[1]*r[1] + r[2]*r[2] );    double normV = sqrt( v[1]*v[1] + v[2]*v[2] );    rplot[iStep] = normR;               // Record position for plotting    thplot[iStep] = atan2(r[2],r[1]);    tplot[iStep] = time;    kinetic[iStep] = 0.5*mass*normV*normV;   // Record energies    potential[iStep] = - GM*mass/normR;      //* Calculate new position and velocity using desired method.    if( method == 1 ) {      accel[1] = -GM*r[1]/(normR*normR*normR);         accel[2] = -GM*r[2]/(normR*normR*normR);         r[1] += tau*v[1];             // Euler step      r[2] += tau*v[2];                   v[1] += tau*accel[1];       v[2] += tau*accel[2];       time += tau;      }     else if( method == 2 ) {      accel[1] = -GM*r[1]/(normR*normR*normR);         accel[2] = -GM*r[2]/(normR*normR*normR);         v[1] += tau*accel[1];       v[2] += tau*accel[2];       r[1] += tau*v[1];             // Euler-Cromer step      r[2] += tau*v[2];                   time += tau;      }    else if( method == 3 ) {      rk4( state, nState, time, tau, gravrk, param );      r[1] = state[1]; r[2] = state[2];   // 4th order Runge-Kutta      v[1] = state[3]; v[2] = state[4];      time += tau;       }    else {      rka( state, nState, time, tau, adaptErr, gravrk, param );      r[1] = state[1]; r[2] = state[2];   // Adaptive Runge-Kutta      v[1] = state[3]; v[2] = state[4];    }    }  //* Print out the plotting variables:   //    thplot, rplot, potential, kinetic  ofstream thplotOut("thplot.txt"), rplotOut("rplot.txt"),
	   tplotOut("tplot.txt"), potentialOut("potential.txt"), 
	   kineticOut("kinetic.txt");  int i;  for( i=1; i<=nStep; i++ ) {    thplotOut << thplot[i] << endl;    rplotOut << rplot[i] << endl;
    tplotOut << tplot[i] << endl;
    potentialOut << potential[i] << endl;    kineticOut << kinetic[i] << endl;  }

  delete [] rplot, thplot, tplot, kinetic, potential;
}/***** To plot in MATLAB; use the script below ********************load thplot.txt; load rplot.txt; load tplot.txt;
load potential.txt; load kinetic.txt;%* Graph the trajectory of the comet.figure(1); clf;  % Clear figure 1 window and bring forwardpolar(thplot,rplot,'+');  % Use polar plot for graphing orbitxlabel('Distance (AU)');  grid;pause(1)   % Pause for 1 second before drawing next plot%* Graph the energy of the comet versus time.figure(2); clf;   % Clear figure 2 window and bring forwardtotalE = kinetic + potential;   % Total energyplot(tplot,kinetic,'-.',tplot,potential,'--',tplot,totalE,'-')legend('Kinetic','Potential','Total');xlabel('Time (yr)'); ylabel('Energy (M AU^2/yr^2)');******************************************************************/

⌨️ 快捷键说明

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