我有以下代码
/*
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作为输出。什么好主意吗?
<解决方案/strong>
我犯了一个愚蠢的错误,认为^
算子是指数(Homer Simpson dough) =>正确的算子是通过使用pow()
函数
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);
这个^
并不意味着你所想的(或者你期望的)。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
进行小积分幂,而是手工编写乘法)。c中的^
是异或运算符,不是取幂。一旦更改了
x
的类型,将printf("%d",x);
重写为printf("%f",x);
。如果你不这样做,那么你的程序行为将是undefined
^
是二进制的XOR
操作符。
对于功率计算,可以使用pow()
。但在使用前注明math.h