牛顿迭代法
求平方根
数学迭代式:x[n+1] = (x[n] + a/x[n])/2.
初始化:x[0] = a/2.
保持:x[n+1] = (x[n] + a/x[n])/2.
终止条件:|x[n+1]-x[n]| < 0.00001时,迭代终止。
代码:
#include "stdio.h"
#include "math.h"
#define MAXSIZE 100
void main() {
float x[MAXSIZE] = {0};
float a = 2;
x[0] = a/2;
x[1] = (x[0] + a/x[0])/2;
int count = 0;
for(int i = 1; fabs(x[i] - x[i-1]) > 0.0000001; i++) {
x[i+1] = (x[i] + a/x[i])/2;
count = i;
}
printf("x[%d] = %f", count, x[count]);
}
输出结果:
求方程的根
数学迭代式:
f(x) = 2*x*x*x – 4*x*x + 3*x – 6;
f(x)的导数g(x)=6*x*x – 8*x + 3;
迭代式:x[n+1] = x[n] – f(x[n])/g(x[n]);
初始化:x[0] = 1.5.
保持:x[n+1] = x[n] – f(x)/g(x).
终止条件:|x[n+1]-x[n]| < 0.00001时,迭代终止。
代码:
#include "stdio.h"
#include "math.h"
#define MAXSIZE 100
void main() {
float x[MAXSIZE] = {0};
x[0] = 1.5;
x[1] = x[0] - (2*x[0]*x[0]*x[0] -4*x[0]*x[0] + 3*x[0] - 6)/(6*x[0]*x[0] - 8*x[0] + 3);
int count = 0;
for(int i = 1; fabs(x[i] - x[i-1]) > 0.0000001; i++) {
x[i+1] = x[i] - (2*x[i]*x[i]*x[i] -4*x[i]*x[i] + 3*x[i] - 6)/(6*x[i]*x[i] - 8*x[i] + 3);
count = i;
}
printf("x[%d] = %f", count, x[count]);
}
输出结果:
二分法
数学迭代式:
a = -10, b = 10.
x = (a + b) /2;
if f(x)*f(a) > 0 b = x;
else a = x.
初始化:a = -10, b = 10; x =(a+b)/2.
保持:if f(x)*f(a) > 0 b = x; else a = x.
终止条件:|f(x)| < 0.00001时,迭代终止。
代码:
#include "stdio.h"
#include "math.h"
float f(float x);
float binary_get_root(float a, float b);
float root = 0;
void main() {
printf("The binary root is: %f", binary_get_root(-10, 10));
}
float f(float x) {
return 2*x*x*x -4*x*x + 3*x - 6;
}
float binary_get_root(float a, float b) {
if(fabs(f(a)) < 0.000001) {
root = a;
return a;
} else if(fabs(f(b)) < 0.000001) {
root = b;
return root;
}
float x = (a + b) /2;
if(f(x)*f(a) > 0) binary_get_root(x, b);
else binary_get_root(a, x);
return root;
}
输出结果: