需要循环的建议

时间:2013-11-27 13:56:55

标签: c# numerical-methods newtons-method

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 表示等式,然后在等等中填写,直到达到极限。 现在,如果你能够遵循这一点,那么说实话非常糟糕!那我请你帮忙!

2 个答案:

答案 0 :(得分:3)

我相信Newton Raphson使用

  

x n + 1 = x n - f(x n )/ f'(x n

可能+1格式化错误(现在已经更正)。

在这种情况下,你循环,直到你足够接近更新x n 。我相信您的代码正在尝试使用ja。让我们感到无聊并使用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