double a = 1, Lspan = 30, Lcable = 33, fn, fdn, dfn, j;
fn = (2 * a * (Math.Sinh(Lspan / 2 * a))) - Lcable;
fdn = (2 * (Math.Sinh(Lspan / 2 * a)) - ((Lspan / 2 * a) * Math.Cosh(Lspan / 2 * a)));
dfn = -fn / fdn;
do
j = a + dfn;
while (dfn > 0.00000000001);
这就是我的代码。我知道写的很糟糕!我是初学者。 所以这是我的问题,从上面我要做的是牛顿拉夫森方法..
x n + 1 = x n - f(x n )/ f'(x n )
现在我知道如何计算f(x n )/ f'(x n ),如上所示,但我遇到的问题是x n 部分。
对于那些不知道的人,使用newton raphson你给x n 做一个猜测估计,让我们说1然后你填入..然后你得到的新答案变成x n 表示等式,然后在等等中填写,直到达到极限。 现在,如果你能够遵循这一点,那么说实话非常糟糕!那我请你帮忙!
答案 0 :(得分:3)
我相信Newton Raphson使用
x n + 1 = x n - f(x n )/ f'(x n )
可能+1格式化错误(现在已经更正)。
在这种情况下,你循环,直到你足够接近更新x n 。我相信您的代码正在尝试使用j
和a
。让我们感到无聊并使用x
代替:
double x = 1, Lspan = 30, Lcable = 33, fn, fdn, dfn;
do
{
fn = (2 * x * (Math.Sinh(Lspan / 2 * x))) - Lcable;
fdn = (2 * (Math.Sinh(Lspan / 2 * x)) - ((Lspan / 2 * x) * Math.Cosh(Lspan / 2 * x)));
dfn = -fn / fdn;
x += dfn;
}
while (dfn > 0.00000000001);
注意 - 这将解决您在何处循环的问题。您需要考虑while
条件 - 您应该检查绝对值。如果以-1000开头会发生什么?
答案 1 :(得分:0)
除了已经告知过的所有内容之外,比如更新循环中的函数值和派生值,并在将它与错误边界进行比较之前从dx中删除符号,代码中还有另一个基本问题。
正如所写,
Lspan / 2 * a
与
相同Lspan * 0.5 * a
假设导数曾经是正确的,可以推断出
Lspan / (2 * a)
是有意的,也可以写成
0.5 * Lspan / a