Программа на 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 в качестве вывода. Есть идеи?

РЕШЕНИЕ

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

3 ответа

 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 куб -> x0*x0*x0,

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

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

2. рассчитать x0 куб как

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

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

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

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

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

Другие вопросы по тегам