2013-11-27 107 views
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 ñ - F(X ñ)/ F」 (X ñ

現在我知道如何計算F(X ñ)/ F'(X ñ)如上所示,但我有問題是x ñ部分。

對於那些不知道是誰,與牛頓拉夫森您爲X ň猜測估計,可以說1,你往裏面in..then你得到的新的答案變爲x ñ的方程你可以用這種方法填充,直到達到極限。 現在,如果你可以遵循這一點,它寫得很糟糕,說實話!那麼請我需要你的幫助!

+2

看起來非常熟悉 - > http://stackoverflow.com/questions/20223022/numerically-solving-an-equation – gleng

+0

老實說,我不知道你在說什麼,但我GOOGLE了你的問題,這個鏈接幫助? http://www.daniweb.com/software-development/csharp/code/369815/newton-raphson-in-c –

+0

我確切地知道牛頓拉夫森方法是什麼,但我不確定這裏的問題是什麼。你在問如何找到xn? – doctorlove

回答

3

相信牛頓拉夫遜使用

X n + 1個 = X Ñ - F(X Ñ)/ F'(X Ñ

也許+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開始會發生什麼?

+0

x每次都會更新是嗎?我試過了,但是我的輸出是1.113,在我的計算器上它顯示了19.648,我認爲這是正確的,我現在查看方程,看看是否有輸入正確!感謝您的回覆 – Dave

+0

@Dave是否更改了使用abs的代碼:http://msdn.microsoft.com/en-us/library/a4ke8e73%28v=vs.110%29.aspx – doctorlove

+0

不,我沒有。我對這一切都很陌生,以前沒有聽說過。 – Dave

0
從一切

除了已經告訴過,如更新循環內的函數值和導數值並將其與錯誤邊界之前去除DX符號,沒有在代碼中的另一個基本問題。

作爲寫入,

Lspan/2 * a 

相同

Lspan * 0.5 * a 

假設衍生物曾經正確的,它可以推斷出

Lspan/(2 * a) 

意,這可能也可寫成

0.5 * Lspan/a