Программа на 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);
Заменить все
int
сdouble
,int
будет усекать до целых значений.перезапись
x0 ^ 3
вx0 * x0 * x0
и т. д. (я предпочитаю не использоватьpow
для малых интегральных степеней, но умножение от руки).^
в с является оператором XOR, а не возведением в степень.перезапись
printf("%d",x);
вprintf("%f",x);
как только вы изменили типx
, Если вы этого не сделаете, то поведение вашей программы будет неопределенным.
^
является двоичным XOR
Оператор в с.
Для расчета мощности вы можете использовать pow()
, Но перед использованием включите math.h