n体仿真中力的推广 当C++中的n体问题编程时,我有一个问题,一般是重力的问题。如果我试图重写我的程序,使其能够轻松地适应任意数量的物体,我在尝试推广力时遇到了一个问题
我编写了以下代码:n体仿真中力的推广 当C++中的n体问题编程时,我有一个问题,一般是重力的问题。如果我试图重写我的程序,使其能够轻松地适应任意数量的物体,我在尝试推广力时遇到了一个问题,c++,C++,我编写了以下代码: #include <cstdlib> #include <iostream> #include <cmath> #include <fstream> #define h 1000.0 #define G 6.67384*pow(10.0,-11) using namespace std; class particle{ public: double kx1,kx2,kx3,kx4, kv1, k
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <fstream>
#define h 1000.0
#define G 6.67384*pow(10.0,-11)
using namespace std;
class particle{
public:
double kx1,kx2,kx3,kx4, kv1, kv2, kv3, kv4;
double ky1, ky2, ky3, ky4, kvy1, kvy2, kvy3, kvy4;
double x,y,vx,vy,m;
double dist(particle aap){
double dx = x - aap.x;
double dy = y - aap.y;
return sqrt(pow(dx,2.0)+pow(dy,2.0));
}
double g(double x1, double y1,particle aap){
return G*aap.m*(aap.x-x1)/pow(dist(aap),3.0);
}
double p(double x1, double y1, particle aap){
return G*aap.m*(aap.y-y1)/pow(dist(aap),3.0);
}
void update(){ //zet het object 1 stap vooruit
x = x + (1/6.0)*(kx1+2*kx2+2*kx3+kx4);
vx = vx + (1/6.0)*(kv1+2*kv2+2*kv3+kv4);
y = y + (1/6.0)*(ky1+2*ky2+2*ky3+ky4);
vy = vy + (1/6.0)*(kvy1+2*kvy2+2*kvy3+kvy4);
}
void create(double x1, double y1, double vx1, double vy1, double m1){
x = x1;
y = y1;
vx = vx1;
vy = vy1;
m =m1;
}
bool operator ==(particle &other){
if(x == other.x && y == other.y && vx == other.vx && vy == other.vy){
return true;
}
}
};
particle zon, maan, aarde;
void set(){
zon.create(1, 1, -2, 1, 2*pow(10.0,30));
aarde.create(1.5*pow(10.0,11), 0, 2, 29780, 6*pow(10.0,24));
maan.create(aarde.x + 1, aarde .y + 3.844399*pow(10.0,8), aarde.vx + -1022.0, aarde.vy + 1, 7.3347*pow(10.0,22));
}
double xforce(double x1, double y1, particle aap){ //kracht in de x-richting
particle bodies[] = {zon, aarde, maan};
double fx;
for (int i = 0; i < 3; i++){
if (bodies[i].x == aap.x && bodies[i].y == aap.y && bodies[i].vx == aap.vx && bodies[i].vy == aap.vy ){;}
else{
fx += aap.g(x1,y1,bodies[i]);
}
}
return fx;
}
double yforce(double x1, double y1, particle aap){ //kracht in de y-richting
particle bodies[] = {zon, aarde, maan};
double fy;
for (int i = 0; i <= 3; i++){
if (bodies[i].x == aap.x && bodies[i].y == aap.y && bodies[i].vx == aap.vx && bodies[i].vy == aap.vy) {;}
else{
fy += aap.p(x1,y1,bodies[i]);
}
}
return fy;
}
void corr(particle& body){
body.kx1 = h*body.vx;
body.kv1 = h*xforce(body.x, body.y, body);
body.ky1 = h*body.vy;
body.kvy1 = h*yforce(body.x, body.y, body);
body.kx2 = h*(body.vx + 0.5*body.kv1);
body.kv2 = h*xforce(body.x + 0.5*body.kx1, body.y + 0.5*body.ky1, body);
body.ky2 = h*(body.vy + 0.5*body.kvy1);
body.kvy2 = h*yforce(body.x + 0.5*body.kx1, body.y + 0.5*body.ky1, body);
body.kx3 = h*(body.vx+ 0.5*body.kv2);
body.kv3 = h*xforce(body.x + 0.5*body.kx2, body.y + 0.5*body.ky2, body);
body.ky3 = h*(body.vy+ 0.5*body.kvy2);
body.kvy3 = h*yforce(body.x + 0.5*body.kx2, body.y + 0.5*body.ky2,body);
body.kx4 = h*(body.vx+body.kv3);
body.kv4 = h*xforce(body.x+ body.kx3, body.y + body.ky3, body);
body.ky4 = h*(body.vy + body.kvy3);
body.kvy4 = h*yforce(body.x + body.kx3, body.y + body.ky3, body);
}
void bereken(){
set();
zon.create(1, 1, -2, 1, 2*pow(10.0,30));
aarde.create(1.5*pow(10.0,11), 0, 2, 29780, 6*pow(10.0,24));
maan.create(aarde.x + 1, aarde .y + 3.844399*pow(10.0,8), aarde.vx + -1022.0, aarde.vy + 1, 7.3347*pow(10.0,22));
ofstream file;
file.open("3body.txt");
for(int i =0; i <=30000; i++){
corr(maan);
corr(zon);
corr(aarde);
zon.update();
aarde.update();
maan.update();
file << i*h <<" "<< zon.x << " "<< zon.y << " "<< zon.vx<< " "<< zon.vy <<" "<< aarde.x << " " << aarde.y <<" "<< aarde.vx <<" " << aarde.vy <<" "<< maan.x<<" "<<maan.y<<"\n";
}
file.close();
}
int main()
{
bereken();
system("pause");
return 0;
}
#包括
#包括
#包括
#包括
#定义h1000.0
#定义G 6.67384*功率(10.0,-11)
使用名称空间std;
类粒子{
公众:
双kx1、kx2、kx3、kx4、kv1、kv2、kv3、kv4;
双ky1、ky2、ky3、ky4、kvy1、kvy2、kvy3、kvy4;
双x,y,vx,vy,m;
双距离(粒子aap){
双dx=x-aap.x;
双dy=y-aap.y;
返回sqrt(pow(dx,2.0)+pow(dy,2.0));
}
双g(双x1,双y1,粒子aap){
返回G*aap.m*(aap.x-x1)/pow(距离(aap),3.0);
}
双p(双x1,双y1,粒子aap){
返回G*aap.m*(aap.y-y1)/pow(距离(aap),3.0);
}
void update(){//zet het对象1 stap vooruit
x=x+(1/6.0)*(kx1+2*kx2+2*kx3+kx4);
vx=vx+(1/6.0)*(kv1+2*kv2+2*kv3+kv4);
y=y+(1/6.0)*(ky1+2*ky2+2*ky3+ky4);
vy=vy+(1/6.0)*(kvy1+2*kvy2+2*kvy3+kvy4);
}
创建空洞(双x1、双y1、双vx1、双vy1、双m1){
x=x1;
y=y1;
vx=vx1;
vy=vy1;
m=m1;
}
布尔运算符==(粒子和其他){
如果(x==other.x&&y==other.y&&vx==other.vx&&vy==other.vy){
返回true;
}
}
};
阿尔德马恩颗粒区;
空集(){
区域创建(1,1,-2,1,2*pow(10.0,30));
创建(1.5*pow(10.0,11),0,229780,6*pow(10.0,24));
创建(aarde.x+1,aarde.y+3.844399*功率(10.0,8),aarde.vx+-1022.0,aarde.vy+1,7.3347*功率(10.0,22));
}
双xforce(双x1,双y1,粒子aap){//kracht in de x-richting
粒子体[]={zon,aarde,maan};
双外汇;
对于(int i=0;i<3;i++){
如果(bodies[i].x==aap.x&&bodies[i].y==aap.y&&bodies[i].vx==aap.vx&&bodies[i].vy==aap.vy{;}
否则{
fx+=aap.g(x1,y1,body[i]);
}
}
外汇收益;
}
双y力(双x1,双y1,粒子aap){//y-richting中的kracht
粒子体[]={zon,aarde,maan};
双fy;
对于(int i=0;i您没有初始化变量
例如:
double fy;
for (int i = 0; i <= 3; i++){
if (bodies[i].x == aap.x && bodies[i].y == aap.y && bodies[i].vx == aap.vx && bodies[i].vy == aap.vy)
{;}
else {
fy += aap.p(x1,y1,bodies[i]);
}
double-fy;
对于(int i=0;我不把你的变量命名为“aap!”这是什么鬼把戏?修复你的缩进,明确你不喜欢的代码是什么(是逻辑错误还是语法错误)?如果可以的话,展示一个小例子,而不是整个代码。问题是我不知道函数yforce()和xforce()中出现了什么错误所以我决定展示我的全部代码。谢谢,你的建议修复了这个程序。@user3642133别忘了在你想在程序中得到的每一笔款项中都这样做!:)此外,如果你同意这个答案,请确保你接受它,这样它就会在问题提要中显示为已解决。
double fy;
for (int i = 0; i <= 3; i++){
if (bodies[i].x == aap.x && bodies[i].y == aap.y && bodies[i].vx == aap.vx && bodies[i].vy == aap.vy)
{;}
else {
fy += aap.p(x1,y1,bodies[i]);
}