我正在编写一些代码来模拟弹簧的运动。鉴于系统的初始位置和速度,我试图在稍后的某个时间计算位置速度。
为此,我近似得出近似值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){...}
似乎已经成功了。
答案 0 :(得分:2)
你有velocity
的永久递归,当堆栈结束时程序崩溃了。错误的比较在第45行:if(f == 0)其中f是浮点数。
答案 1 :(得分:1)
永远不要使用==
与浮点数进行比较,3 * 0.1
为0.30000000000000004
,因此看起来您的程序会进入无限循环。
相反,尝试在离散域中建模时间(换句话说,使用int
)并计算实时,例如float t = nQuants * quantDuration
quantDuration
可能等于0.1f
或其他小值。
答案 2 :(得分:1)
问题是递归,它不会停止(永远不会达到0)
将比较“if(t == 0)”更改为“if(t <= 0)”,并停止依赖浮点数,它们非常不安全(由于二进制 - >浮动对话)