C程序设计 (第四版) 谭浩强 习题7.12
习题 7.12 用牛顿迭代法求根。方程为 a x 3 + b x 2 + c x + d = 0 ax^3+bx^2+cx+d=0 ax3+bx2+cx+d=0,系数a,b,c,d的值依次为1, 2, 3, 4,由主函数输入。求x在1附近的一个实根。求出根后由主函数输出。
根据牛顿迭代法的公式:
x n + 1 = x n − f ( x n ) f ′ ( x n ) x_{n+1}=x_n-\frac{f(x_n)}{f'(x_n)} xn+1=xn−f′(xn)f(xn)
得到
f
(
x
n
)
=
a
x
3
+
b
x
2
+
c
x
+
d
f(x_n)=ax^3+bx^2+cx+d
f(xn)=ax3+bx2+cx+d
f
′
(
x
n
)
=
3
a
x
2
+
2
b
x
+
c
f'(x_n)=3ax^2+2bx+c
f′(xn)=3ax2+2bx+c
IDE工具:VS2010
Note: 使用不同的IDE工具可能有部分差异。
代码块
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//初始化系数
void initialCoefficient(double **a, double **b, double **c, double **d, double **x){
*a = (double*)malloc(sizeof(double));
*b = (double*)malloc(sizeof(double));
*c = (double*)malloc(sizeof(double));
*d = (double*)malloc(sizeof(double));
*x = (double*)malloc(sizeof(double));
}
//输入系数和x值
void inputCoefficient(double *a, double *b, double *c, double *d, double *x){
printf("Enter the coefficient of equation a, b, c, d and x: ");
scanf("%lf %lf %lf %lf %lf", a, b, c, d, x);
}
//牛顿迭代法
double newtonIteration(double *a, double *b, double *c, double *d, double *x){
double formula1 = (*a) * pow(*x, 3) + (*b) * pow(*x, 2) + (*c) * (*x) + (*d);
double formula2 = 3.0 * (*a) * pow(*x, 2) + 2.0 * (*b) * (*x) + (*c);;
for(int i = 0; fabs(formula1/formula2) > 1e-5; i++){
*x -= formula1 / formula2;
formula1 = (*a) * pow(*x, 3) + (*b) * pow(*x, 2) + (*c) * (*x) + (*d);
formula2 = 3.0 * (*a) * pow(*x, 2) + 2.0 * (*b) * (*x) + (*c);
}
return *x;
}
//释放内存
void freeCoefficient(double **a, double **b, double **c, double **d, double **x){
free(*a);
free(*b);
free(*c);
free(*d);
free(*x);
}
int main(){
double *a = NULL;
double *b = NULL;
double *c = NULL;
double *d = NULL;
double *x = NULL;
initialCoefficient(&a, &b, &c, &d, &x);
inputCoefficient(a, b, c, d, x);
printf("Real Root: %.2lf\n", newtonIteration(a, b, c, d, x));
freeCoefficient(&a, &b, &c, &d, &x);
system("pause");
return 0;
}