如何求解方程并以正确的方式保存
How to solve equation and save in right way?
我是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;
}
我假设Ntimestep
的原始值是10000
(C样式数组x
、y
、z
、Fx
、Fy
、Fz
、vx
、vy
、vz
和force
的维度),而不是实际的1000
。
对于实际的Ntimestep = 1000
,我看不出出现分段错误的情况;但对于Ntimestep = 10000
,当for
周期中的i
为9999(最后一次迭代)时,在以下指令中
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);
您在force
、vy
和y
中的10000位置进行书写。这很糟糕(你是C++的学习者,但我想你知道你可以从0
到n-1
读/写X x[n]
数组,并且x[n]
中的访问是越界访问)。
无粒子顺序的一些建议
1) 注意压痕;你的代码很难阅读
2) 尽可能避免全局变量
3) 在可能的情况下使用常量(constexpr
,如果可能,如果使用C++11/C++14);全局常量很好,您可以用它们定义数组大小;例如,您可以定义一个全局常量
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
周期可以是
for (int i=0;i<numSteps;i++)
4) 考虑使用std::vector<double>
(与resize(numSteps+1)
一起)而不是C型阵列的假设;如果使用std::vector
,使用at()
而不是[i]
,则会出现异常,并且会立即发现越界错误
4 bis)如果您使用C++11/C++14,std::array<double, numSteps+1>
可能是比std::vector<double>
更好的解决方案
p.s.:很抱歉我的英语不好
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 如何在c++中为模板函数实例创建快捷方式
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 在c代码之间共享数据的最佳方式
- 在C++中将函数压缩为两种方式
- 以螺旋方式打印矩阵的程序.(工作不好)
- 文件追加的方式是,它在每次保存C++后结束行
- 如何求解方程并以正确的方式保存
- 保存代码版本 (Xcode) 的优雅方式
- IPersistFile::Save方法始终无法保存快捷方式
- C++在成员变量中保存不同类型数据的优雅方式
- 为什么float变量通过以一种奇怪的方式在点后切割数字来保存值
- 保存数据以便在体素编辑器中重复使用的最佳方式
- 保存图节点的最佳方式
- 保存源函数的最佳方式
- 在Emacs中保存-编译-执行c++程序的快捷方式
- 用unicode文件名保存文件的问题-如何以跨平台的方式正确保存UTF-8文件名
- 保存应用程序设置 MFC CArchive 方式
- VB和C++ActiveX控件以不同的方式保存其信息,如何实现C++ActiveX控件来代替VB ActiveX