尝试用C中的newton raphson方法找到近似根?

时间:2018-01-26 04:22:30

标签: c codeblocks newtons-method

#include<stdio.h>
#include<conio.h>
#include<math.h>
double valOfFuncAt(double );
double derivativeAt(double );
double a,b,c,d;

int main(){
    double xo;
    double x1;
    double fx,f_x;

    printf("Enter The Coefficients Of The Cubic Equation");
    scanf("%f%f%f%f",&a,&b,&c,&d);
    printf("Enter The First Approximate Root");
    scanf("%f",&xo);
    fx=valOfFuncAt(xo);
    f_x=derivativeAt(xo);
    x1= xo-(fx/f_x);
    while(valOfFuncAt(x1) >= 0.0001){
        fx=valOfFuncAt(x1);
        f_x=derivativeAt(x1);
        x1= x1 - (fx/f_x);

    }
    printf("\nApproximate Root Of The Equation Is : %f",x1);
    getch();
    return 0;
}

double valOfFuncAt(double x){
    double fx1;
    fx1 = (a*x*x*x) + (b*x*x) + (c*x) +d;
    return fx1;
}
double derivativeAt(double x){
    double f_x1;
    f_x1 = (3*a*x*x) + (2*b*x) + c;

    return f_x1;
}

当我为代码块中的任何三次方程运行它时,例如x^3-3x+1=0,并且给出0.3是第一个近似根,它产生错误的输出并且我没有得到我做错了逻辑!

3 个答案:

答案 0 :(得分:1)

Newton-Raphson方程是

equation

每次迭代后都会找到x的新值。然后你必须使用新值来查找函数的输出及其派生。

您只需x即可完成此操作。不需要2个变量。像

double x;
printf("Enter The First Approximate Root");
scanf("%lf",&x);
while( valOfFuncAt(x)>=0.0001 )
{
    x = x-valOfFuncAt(x)/derivativeAt(x);
}

您使用的double变量的格式说明符应为%lf而不是%f(适用于float)。

此处您不需要math.h

此外,conio.hgetch()不是标准的,最好避免使用。

答案 1 :(得分:0)

doublescanf的正确格式说明符为%lf。否则,您使用双变量的错误格式说明符进行未定义的行为。正确的是

scanf("%lf",&xo);

来自standard §7.21.6.2p11

  

l (ell)   指定以下d,i,o,u,x,X或n转换说明符适用于类型指针为long int或unsigned long int的参数; a a,a,e,E,f,F,g或G转换说明符适用于类型指针为double的参数; 或...

答案 2 :(得分:0)

您已在%f中使用scanf()作为格式说明符输入根,但%f用于输入float类型数据,并用作{{1}的数据类型} xo使用double作为%lf中的格式说明符,也使用scanf()函数打印结果。