#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是第一个近似根,它产生错误的输出并且我没有得到我做错了逻辑!
答案 0 :(得分:1)
Newton-Raphson方程是
每次迭代后都会找到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.h
和getch()
不是标准的,最好避免使用。
答案 1 :(得分:0)
double
中scanf
的正确格式说明符为%lf
。否则,您使用双变量的错误格式说明符进行未定义的行为。正确的是
scanf("%lf",&xo);
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()
函数打印结果。