dt; a=(时间/dt); v=新浮点数[a]; h=新浮点数[a]; v[0]=0; h[0]=0; 浮动tt=0; //用于循环计算速度和时间 对于(int i=0;i,c++,C++" /> dt; a=(时间/dt); v=新浮点数[a]; h=新浮点数[a]; v[0]=0; h[0]=0; 浮动tt=0; //用于循环计算速度和时间 对于(int i=0;i,c++,C++" />

火箭c+的速度和高度建模+; 我们应该在我们的最后一个项目中,用C++模拟火箭的高度和速度。让用户输入他们希望测量的飞行期间各点的总飞行时间和增量时间。下面是我为这个项目编写的代码。速度应该是正的,60秒后,没有剩余的燃料,因此没有推力,速度应该开始变为负。然而,我的高度和速度从一开始就是负的,到最后达到负无穷大 #include <iostream> using namespace std; int main() { float *v; float *h; float a; double mass=0.0, thrust, time, dt; double g = 32.2; double K = 0.008; cout << "enter time"; cin >> time; cout << "enter dt"; cin >> dt; a = (time/dt); v = new float[a]; h = new float[a]; v[0] = 0; h[0] = 0; float tt = 0; // for loop to calculate velocity and time for(int i = 0; i <= (time/dt) ; i++) { tt = dt + tt; if( tt <= 60) { mass = (3000-(40*tt)/g); thrust = 7000; } if ( tt > 60) { mass = 3000/g; thrust = 0; } // these are the formulas for velocity and height position our prof gave us v[i+1] = v[i] - (K/mass)*v[i]*v[i-1] * dt + (thrust/mass - g)*dt; h[i+1] = v[i+1] * dt + h[i]; } // for loop to output for(int i = 0; i <= (time/dt); i++) { cout << i << " - " << "Velocity:" << v[i+1] << " Position:" << h[i+1] <<endl; } return 0; } #包括 使用名称空间std; int main() { 浮动*v; 浮动*h; 浮动a; 双质量=0.0,推力,时间,dt; 双g=32.2; 双K=0.008; 时间; cout>dt; a=(时间/dt); v=新浮点数[a]; h=新浮点数[a]; v[0]=0; h[0]=0; 浮动tt=0; //用于循环计算速度和时间 对于(int i=0;i

火箭c+的速度和高度建模+; 我们应该在我们的最后一个项目中,用C++模拟火箭的高度和速度。让用户输入他们希望测量的飞行期间各点的总飞行时间和增量时间。下面是我为这个项目编写的代码。速度应该是正的,60秒后,没有剩余的燃料,因此没有推力,速度应该开始变为负。然而,我的高度和速度从一开始就是负的,到最后达到负无穷大 #include <iostream> using namespace std; int main() { float *v; float *h; float a; double mass=0.0, thrust, time, dt; double g = 32.2; double K = 0.008; cout << "enter time"; cin >> time; cout << "enter dt"; cin >> dt; a = (time/dt); v = new float[a]; h = new float[a]; v[0] = 0; h[0] = 0; float tt = 0; // for loop to calculate velocity and time for(int i = 0; i <= (time/dt) ; i++) { tt = dt + tt; if( tt <= 60) { mass = (3000-(40*tt)/g); thrust = 7000; } if ( tt > 60) { mass = 3000/g; thrust = 0; } // these are the formulas for velocity and height position our prof gave us v[i+1] = v[i] - (K/mass)*v[i]*v[i-1] * dt + (thrust/mass - g)*dt; h[i+1] = v[i+1] * dt + h[i]; } // for loop to output for(int i = 0; i <= (time/dt); i++) { cout << i << " - " << "Velocity:" << v[i+1] << " Position:" << h[i+1] <<endl; } return 0; } #包括 使用名称空间std; int main() { 浮动*v; 浮动*h; 浮动a; 双质量=0.0,推力,时间,dt; 双g=32.2; 双K=0.008; 时间; cout>dt; a=(时间/dt); v=新浮点数[a]; h=新浮点数[a]; v[0]=0; h[0]=0; 浮动tt=0; //用于循环计算速度和时间 对于(int i=0;i,c++,C++,您正在使用v[i-1],但我从0开始,因此此计算将使用发生在v[-1]的任何值。我建议您将i初始化为1(然后检查i的所有用法,以确保使用正确的数组元素).我不是100%相信forumla,我不明白为什么它包含一个v[I]和一个v[I-1]术语。无论如何,即使正确,在第一次迭代(I==0)中,你也在速度数组的边界之外:v[I-1]。这是未定义的行为 要解决这个问题,请查看公式,它是否真的包含v[i-1]项?。或者从i=1开始迭代(并初始化v[0]和v[1])。忽略对v[-1]的越界访问当i为零时,

您正在使用v[i-1],但我从0开始,因此此计算将使用发生在v[-1]的任何值。我建议您将i初始化为1(然后检查i的所有用法,以确保使用正确的数组元素).

我不是100%相信forumla,我不明白为什么它包含一个
v[I]
和一个
v[I-1]
术语。无论如何,即使正确,在第一次迭代(
I==0
)中,你也在速度数组的边界之外:
v[I-1]
。这是未定义的行为


要解决这个问题,请查看公式,它是否真的包含
v[i-1]
项?。或者从
i=1
开始迭代(并初始化
v[0]
v[1]
)。

忽略对
v[-1]
的越界访问当
i
为零时,您的推力、质量或重力都有问题

推力是7000,时间=0时质量是3000。这意味着推力/质量刚刚超过2。g=32(真的吗?你在用英制单位进行火箭计算?),这意味着火箭从来没有足够的推力来抵消重力,只是坐在垫子上



编辑:那将是现实。因为这是一个相当简单的模拟,不包括“垫”,在模型中火箭开始自由下落到地球中心。

谢谢你们的帮助,我能够解决它

    #include <iostream>

    using namespace std;

   int main()
  {
  double *v;
double *h;
double g = 32.2;
double K = .008;
double mass;
double t;
double dt;
double tt = 0;
double thrust;

cout << "t \n";
cin >> t;
cout << "dt \n";
cin >> dt;

double a = t/dt;
v = new double[a];
h = new double[a];
v[0] = 0;
h[0] = 0;
for (int i = 0; i <= a; i++)
{

    tt = tt+dt;

    if( tt == 0)
    {
        thrust = 7000;
        mass = (3000 -40*dt)/g;
        v[i+1] = v[i] + ((thrust/mass)-g)*dt;
    }
    else if( tt > 0 && tt < 60)
    {
        thrust = 7000;
        mass = (3000 - 40 *tt)/g;
        v[i+1] = v[i] - ((K/mass)*v[i]*v[i-1] * dt) + ((thrust/mass) - g)*dt;
    }
    else if (tt > 60)
    {
        thrust = 0;
        mass = 600/g;
        v[i+1] = v[i] - ((K/mass)*v[i]*v[i-1] * dt) + ((thrust/mass) - g)*dt;
    }
    h[i+1] = v[i+1] * dt + h[i];

}



cout << " end results \n";
for(int i = 0; i <= a; i++)
{
    cout << i << " v - " << v[i] << " h - " << h[i] <<endl;

}

return 0;
}
#包括
使用名称空间std;
int main()
{
双*v;
双*h;
双g=32.2;
双K=.008;
双质量;
双t;
双dt;
双tt=0;
双推力;
cout>t;
cout>dt;
双a=t/dt;
v=新的双[a];
h=新的双[a];
v[0]=0;
h[0]=0;
对于(int i=0;i 0&&tt<60)
{
推力=7000;
质量=(3000-40*tt)/g;
v[i+1]=v[i]-((K/质量)*v[i]*v[i-1]*dt)+((推力/质量)-g)*dt;
}
否则,如果(tt>60)
{
推力=0;
质量=600/g;
v[i+1]=v[i]-((K/质量)*v[i]*v[i-1]*dt)+((推力/质量)-g)*dt;
}
h[i+1]=v[i+1]*dt+h[i];
}

如果火箭的初始速度为零,那么它怎么能飞行呢?另外还有很多概念上和编程上的错误…重新检查你的代码,试着指出你认为错误的地方。@organicoman:呃,在发射时,火箭的速度为零,然后向上加速。(看看任何太空发射)。去掉float*v,*h,然后添加(获得A的值)浮点v[Madia.CiIL(a)],H[Maul.Ciel[a(])] Okkar。k:1。Math.ceil不是C++(它是java)。2。C++要求数组边界是编译时常数(虽然有些编译器有扩展,允许可变大小的数组)。在编码之前,你可以考虑查看你的解决方案,这个问题是众所周知的象征性的解决方案,因此,它将帮助你与代码的结果进行比较,这只是一个集成。也许在你可以考虑更精确的数值集成方案之后。
    #include <iostream>

    using namespace std;

   int main()
  {
  double *v;
double *h;
double g = 32.2;
double K = .008;
double mass;
double t;
double dt;
double tt = 0;
double thrust;

cout << "t \n";
cin >> t;
cout << "dt \n";
cin >> dt;

double a = t/dt;
v = new double[a];
h = new double[a];
v[0] = 0;
h[0] = 0;
for (int i = 0; i <= a; i++)
{

    tt = tt+dt;

    if( tt == 0)
    {
        thrust = 7000;
        mass = (3000 -40*dt)/g;
        v[i+1] = v[i] + ((thrust/mass)-g)*dt;
    }
    else if( tt > 0 && tt < 60)
    {
        thrust = 7000;
        mass = (3000 - 40 *tt)/g;
        v[i+1] = v[i] - ((K/mass)*v[i]*v[i-1] * dt) + ((thrust/mass) - g)*dt;
    }
    else if (tt > 60)
    {
        thrust = 0;
        mass = 600/g;
        v[i+1] = v[i] - ((K/mass)*v[i]*v[i-1] * dt) + ((thrust/mass) - g)*dt;
    }
    h[i+1] = v[i+1] * dt + h[i];

}



cout << " end results \n";
for(int i = 0; i <= a; i++)
{
    cout << i << " v - " << v[i] << " h - " << h[i] <<endl;

}

return 0;
}