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作为输出。什么好主意吗?

<

解决方案/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。声明x0xdouble

2。计算x0的立方体为

pow(x,3);     
  1. int全部替换为doubleint将截断为整数值。

  2. x0 ^ 3重写为x0 * x0 * x0等(我更喜欢不使用pow进行小积分幂,而是手工编写乘法)。c中的^是异或运算符,不是取幂。

  3. 一旦更改了x类型,将printf("%d",x);重写为printf("%f",x);。如果你不这样做,那么你的程序行为将是undefined

^是二进制的XOR操作符。

对于功率计算,可以使用pow()。但在使用前注明math.h

最新更新