2013-11-27 4 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); 

Это мой код. Я знаю, что это очень плохо написано! Я начинающий. Так вот мой вопрос, сверху, что я пытаюсь сделать, это метод ньютона Рафсона ..Необходимые консультации:

х п + 1 = х п - ф (х п)/ф» (х п)

Теперь я знаю, как вычислить п (х п)/ф '(х п), как показано выше, но то, что у меня есть проблемы с это х п часть.

Для тех, кто не знает, с ньютон Рафсоном вы дать оценку догадки для й п, позволяет сказать, что 1 и вы заполняете его in..then нового ответа вы получите становится й п для уравнения и вы заполняете это так вперед, пока не достигнете предела. Теперь, если бы вы могли следовать этому, его очень плохо написано, если честно! Тогда, пожалуйста, мне нужна ваша помощь!

+2

Выглядит ужасно знакомо -> http://stackoverflow.com/questions/20223022/numerically-solving-an-equation – gleng

+0

Честно говоря, я понятия не имею, о чем вы говорите, но я искал вашу проблему, помогает ли эта ссылка ? http://www.daniweb.com/software-development/csharp/code/369815/newton-raphson-in-c –

+0

Я точно знаю, что такое метод Ньютона Рафсона, но я не уверен, что здесь вопрос. Вы спрашиваете, как найти xn? – doctorlove

ответ

3

Я считаю, что Ньютон Рафсона использует

х п + 1 = х п - Р (х п)/Р '(х п)

Может +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?

+0

Является ли х обновляется каждый раз, когда да? Я пробовал, но мой результат равен 1.113, а на моем калькуляторе он показывает 19.648, что, я думаю, правильно, я смотрю на уравнения теперь, чтобы увидеть, если они введены правильно! Спасибо за ответ. – Dave

+0

@ Дай вы изменили код на использование 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 
Смежные вопросы