0
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并填写一个等等,直到你达到了极限。现在,如果您能遵循这一点,说实话,它写得非常糟糕!那么请我需要你的帮助!

4

2 回答 2

3

我相信牛顿拉夫森使用

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 开始会发生什么?

于 2013-11-27T14:23:15.760 回答
0

除了已经告诉过的所有其他内容,例如更新循环内的函数值和导数值以及在将其与错误边界进行比较之前从 dx 中删除符号之外,代码中还有另一个基本问题。

如所写,

Lspan / 2 * a

是相同的

Lspan * 0.5 * a

假设导数曾经是正确的,可以推断出

Lspan / (2 * a)

是有意的,也可以写成

0.5 * Lspan / a
于 2013-12-13T10:39:55.127 回答