如何解决方程并以正确的方式保存?

时间:2016-04-18 05:04:41

标签: c++

我是c ++的新学习者。所以实际上我会尝试找出每个时间步长(dt = 0.00001)中的总力,速度,位置和总时间,并从解决简单方程中保存myfile1,myfile2,myfile3,myfile4。我正面临着找出确切价值的问题。当我运行程序时,找到分段错误错误。那我怎么解决这个问题呢?我附上下面给出的计划:任何人都可以帮助我吗?

//C++ programming for selection random number
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <ctime>
#include <sstream>
#include <string>
#include <iomanip>
#include <cmath>


//%stifness
double kp=1000;
//%gravitational
double g=-9.81;


    double x[10000], y[10000], z[10000];
    double Fx[10000],Fy[10000],  Fz[10000];
    double vx[10000],vy[10000], vz[10000] ;
    double ax[10000],ay[10000], az[10000] ;
    double force[10000];
    const double PI=4.0*atan(1.0); 

    using namespace std;
int main()
{
    srand((unsigned) time(NULL));
//open output file
    ofstream myfile1;
    myfile1.open("1.dat");
    ofstream myfile2;
    myfile2.open("2.dat");
    ofstream myfile3;
    myfile3.open("3.dat");
    ofstream myfile4;
    myfile4.open("4.dat");


// %particle parameter

double  dt=1e-5;
double Ntimestep=1000;

//particle properties
    double R=0.003;
    double Dens=2600;
        int npart=1;

//Particle Creation 
        double Mass=(Dens*4*PI*(pow(R,3))/3);    //m=(4/3)* Dens*Pi*R^3
        cout<<"Mass="<< Mass<<endl;

//initial position of the particle

        x[0]=0;
            y[0] =0.01;
            z[0] =0;

// movement of the particle
// Particle initial velocity and forces
     Fx[0]=0;
     Fy[0]=0; 
     Fz[0]=0;
     vx[0]=0;
     vy[0]=-0.5;
     vz[0]=0;
     force[0]=0;

// Relation between dashport coefficient and coefficient of restitution
     double exp=0.9;
     double lnexp=0.10536;
     double Eta= ((2*sqrt(Mass*kp)*lnexp)/(sqrt(pow(PI,2)+pow(lnexp,2))));

//Time step
    int t=0;
for (int i=0;i<Ntimestep;i++)
{

// calculate particle to wall contact force

       if (y[i]<R)
            {
                Fy[i]=(-kp*(y[i]-R))-Eta*vy[i];
            }

// Calculate initial acceleration

        ay[i]=(Fy[i]/Mass)+g;
//force[i]+=force[1];
        force[i+1]=ay[i]*Mass;
        //cout<<"Total_Force="<<force<<endl;

// update valocity and displacement/location

    vy[i+1]=(vy[i]+(ay[i]*dt));
    y[i+1]=y[i]+vy[i]*dt+0.5*ay[i]*pow(dt,2);
    Fy[i]=0;

    t=t+1;

     double time=t*dt;



//...............output/save file..............................

cout<<"Total force="<<force<<endl;
myfile1<<"Total force="<<force<<endl;

cout<<"velocity="<<vy<<endl;
myfile2<<"velocity="<<vy<<endl;

cout<<"location="<<y<<endl;
myfile3<<"location="<<y<<endl;

cout<<"Total time"<<time<<endl;
myfile4<<"Total time="<<time<<endl;

}


//system ("PAUSE");
    cin.ignore();
    cin.get();
    myfile1.close();
    myfile2.close();
    myfile3.close();
    myfile4.close();



    return 0;
}

1 个答案:

答案 0 :(得分:1)

我认为Ntimestep的原始值为10000(C样式数组的维度xyz,{{ 1}},FxFyFzvxvyvz),而不是实际的force

对于实际的1000,我没有看到分段错误的情况;但Ntimestep = 1000时,Ntimestep = 10000周期中的i为9999(最后一次迭代),请参阅以下说明

for

你在force[i+1]=ay[i]*Mass; vy[i+1]=(vy[i]+(ay[i]*dt)); y[i+1]=y[i]+vy[i]*dt+0.5*ay[i]*pow(dt,2); forcevy中写入10000位。这很糟糕(你是C ++的学习者,但我想你知道你可以阅读/从y写一个X x[n]数组到0,并且n-1中的访问权限是一个超出限制的访问权限。

一些建议,没有特别的顺序

1)照顾压痕;你的代码难以阅读

2)尽可能避免全局变量

3)尽可能使用常量(x[n],如果可能的话,使用C ++ 11 / C ++ 14);全局常量很好,你可以用它们定义数组大小;例如,您可以定义全局常量

constexpr

和数组定义(我建议 const int numSteps = 10000; 中的本地)可以是

main()

double x[numSteps+1], y[numSteps+1], z[numSteps+1]; double Fx[numSteps+1],Fy[numSteps+1], Fz[numSteps+1]; double vx[numSteps+1],vy[numSteps+1], vz[numSteps+1] ; double ax[numSteps+1],ay[numSteps+1], az[numSteps+1] ; double force[numSteps+1]; 为数组提供另一个位置并避免上述问题)+1周期可以

for

4)考虑使用 for (int i=0;i<numSteps;i++) (带std::vector<double>)而不是C风格数组的假设;使用resize(numSteps+1)而不是std::vector使用at(),您会遇到异常并且您会立即发现出界错误

4 bis)如果您使用的是C ++ 11 / C ++ 14,[i]可能是比std::array<double, numSteps+1>更好的解决方案

p.s:抱歉我的英语不好