【问题标题】:Looping advice needed需要循环建议
【发布时间】:2013-12-13 18:39:55
【问题描述】:
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);

这就是我的代码。我知道它写得很糟糕!我是初学者。 所以这是我的问题,从上面我想做的是牛顿拉夫森方法..

xn+1 = xn - f(xn)/f'(xn )

现在我知道如何计算 f(xn)/f'(xn) 如上所示,但我遇到的问题是 x n 部分。

对于那些不知道的人,用牛顿拉夫森你给 xn 的一个猜测估计,假设 1 然后你把它填进去..那么你得到的新答案就变成 x n 为等式,然后以此类推,直到达到极限。 现在,如果您能遵循这一点,说实话,它写得非常糟糕!那么我需要你的帮助!

【问题讨论】:

标签: c# numerical-methods newtons-method


【解决方案1】:

我相信 Newton Raphson 使用

xn+1 = xn - f(xn)/f'(xn )

可能 +1 的格式有误(现已更正)。

在这种情况下,你循环直到你足够接近更新 xn 。我相信您的代码正在尝试为此使用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 开始会发生什么?

【讨论】:

  • x 每次都会更新吗?我试过了,但我的输出是 1.113,在我的计算器上显示 19.648,我认为这是正确的,我现在正在查看方程式,看看是否输入正确!谢谢你的回复
  • @Dave 你把代码改成使用abs了吗:msdn.microsoft.com/en-us/library/a4ke8e73%28v=vs.110%29.aspx
  • 不,我没有。我对这一切都很陌生,以前从未听说过。
【解决方案2】:

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

正如所写,

Lspan / 2 * a

相同
Lspan * 0.5 * a

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

Lspan / (2 * a)

是有意的,也可以写成

0.5 * Lspan / a

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    相关资源
    最近更新 更多