2015-09-22 2 views
-2

У меня есть следующий кодпрограммы C, чтобы вычислить оценочный корень с помощью метода Ньютонов

/* 
    KENDALL WEIHE 
    CS321 HW2 PROBLEM 3 
    PURPOSE: COMPUTE THE 5TH STEP OF NEWTONS METHOD TO ESTIMATE THE ROOT OF A FUNCTION 
    INTPUTS: INITIAL X0 = 1.5 
    OUTPUTS: ESTIMATED ROOT AFTER 5 ITERATIONS 
*/ 

#include <stdio.h> 

int main(int argc, char *argv[]) { 
    //f(x) = -x^3 + x^2 + x + 1 
    //f'(x) = -3x^2 + 2x + 1 
    //l(x) = f'(x)(x - x0) + f(x) 
    //l(x) = (-3x0^2 + 2x0 + 1)(x - x0) + (-x0^3 + x0^2 + x0 + 1) 
    //where x0 = x sub 0 || x nought 
    //substitute x0, solve for x 
    //x becomes new x0, iterate 5 times 
    //solving for the root we find 
     //0 = l(x) 
     //x = [4x0^3 + x0^2 - 1]/[3x0^2 + 2x0 + 1] 
    int i; 
    int x0 = 1.5; 
    int x; 
    for (i=0;i<5;i++){ 
     x = (4*x0^3 + x0^2 - 1)/(3*x0^2 + 2*x0 + 1); 
     x0 = x; 
    } 
    printf("%d",x); 
} 

Это довольно прямо вперед программа до тех пор, как вы понимаете, метод ньютона (слайд 16) http://www.cs.uky.edu/~jzhang/CS321/lecture2.pdf

я получаю 0 в качестве выхода. Есть идеи?

РЕШЕНИЕ

Я сделал глупую ошибку, думая, что оператор ^ был экспонент (Homer Simpson тесто) => правильный оператор с помощью pow() функции

+5

'int x0 = 1.5;' вы имеете в виду 'double'?И используйте 'pow()' вместо '^' ('^' означает побитовое xor в C) –

+0

int x0 = 1.5; !! –

ответ

4
int x0 = 1.5; // you want double or float I think . prefer double 

И это выражение -

x = (4*x0^3 + x0^2 - 1)/(3*x0^2 + 2*x0 + 1); 

Этот ^ не означает, что вы думаете (или что вы ожидаете от этого). Это двоичный XOR оператор в C.

Либо написать его вручную, как это - x0 «s куб ->x0*x0*x0.

Или используйте функцию pow из заголовка <math.h>.

1. объявить x0 и x, как double.

2. высчитывает x0 куб «s, как

pow(x,3);  
1
  1. Заменить все int с double. Значение int будет обрезано до целых значений.

  2. Перепишите x0^3 в x0 * x0 * x0 и т. Д. (Я предпочитаю не использовать pow для небольших интегральных мощностей, но с ручным умножением). ^ в c является оператором XOR, не возведение в степень.

  3. Rewrite printf("%d",x); к printf("%f",x);, как только вы изменили тип из x. Если вы этого не сделаете, ваше поведение будет undefined.

1

The ^ является двоичным XOR Оператор в С.

Для расчета мощности можно использовать pow(). Но перед использованием укажите math.h

Смежные вопросы