代码中的分段错误以模拟弹簧运动

时间:2016-01-20 07:30:07

标签: c++ segmentation-fault comparison

我正在编写一些代码来模拟弹簧的运动。鉴于系统的初始位置和速度,我试图在稍后的某个时间计算位置速度。

为此,我近似得出近似值x(t + e)= x(t)+ ev(t)。短时间'e'秒后的位置等于当前位置加上e乘以速度。

我们可以对速度做同样的事情。 v(t + e)= v(t)+ ea(t)。新速度与旧速度加上加速度和时间的乘积相同。对于弹簧,a(t)= -x(t),所以我们改为v(t + e)= v(t) - ex(t)。

我的程序的想法是在某些“步骤”打印位置和速度(步骤等于e)。

根据上述等式,我定义了位置和速度的函数。

#include <iostream>
using namespace std;

//Defining the initial state of the system
float initialPosition = 1;
float initialVelocity = 0;
float step = 0.1; 
float duration = 5;

int numberSteps = duration / step;


//Declaring the functions
float position(float t);
float velocity(float t);

//Outputting the position and velocity at time steps
int main() 
{
    cout << "Time \t" << "Position \t" << "Velocity \t" << endl;

    for(int i = 0; i < numberSteps; ++i)
    {
        cout << step * i << "\t" << position(step * i) << "\t \t" << velocity(step * i) << endl;
    }

    return 0;
}


float position(float t)
{
    if(t == 0)
    {
        return initialPosition;
    }
    else 
    {
        return position(t - step) + step * velocity(t - step);
    }
}

float velocity(float t)
{
    if(t == 0)
    {
        return initialVelocity;
    }
    else
    {
        return velocity(t - step) - step * position(t - step);
    }
}

我得到的输出(在textmate上)如下

Time    Position    Velocity    
0          1            0
0.1        1         -0.1
0.2        0.99      -0.2
bootstrap.sh: line 10:   595 Segmentation fault: 11  "$A_OUT"

我试图找出分段错误是什么,但许多来源似乎都说它与指针有关(我不知道,并且没有在此程序中使用)。我花了一个下午试图在我的mac上配置gdb,找出确切的错误,但无济于事。

修改 我理解浮点数的问题。

更换

if(t == 0){...}

if(t < 0.1 * step){...} 

似乎已经成功了。

3 个答案:

答案 0 :(得分:2)

你有velocity的永久递归,当堆栈结束时程序崩溃了。错误的比较在第45行:if(f == 0)其中f是浮点数。

答案 1 :(得分:1)

永远不要使用==与浮点数进行比较,3 * 0.10.30000000000000004,因此看起来您的程序会进入无限循环。

相反,尝试在离散域中建模时间(换句话说,使用int)并计算实时,例如float t = nQuants * quantDuration quantDuration可能等于0.1f或其他小值。

答案 2 :(得分:1)

问题是递归,它不会停止(永远不会达到0)

将比较“if(t == 0)”更改为“if(t <= 0)”,并停止依赖浮点数,它们非常不安全(由于二进制 - >浮动对话)