牛顿迭代公式:
Xn+1=Xn-f(Xn)/f(Xn)利用X1=X0-f(X0)/f(X0) X2=X1-f(X1)/f(X1) X3=X2-f(X2)/f(X2)…Xk+1=Xk-f(Xk)/f`(Xk)
求解通常有3步:
1.确定迭代变量,存在一个可直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。
2.建立迭代关系式(有些题目已给)
3.对迭代过程进行控制,也就是算法实现
题目:
用迭代法x=(a)^(1/2)。求平方根的迭代公式为X(n+1)=(1/2)(Xn+a/Xn),要求前后两次求出的X的差的绝对值小于0.00001
思路:
用迭代法x=(a)^(1/2)。求平方根的迭代公式为X(n+1)=(1/2)(Xn+a/Xn),要求前后两次求出的X的差的绝对值小于0.00001
利用牛顿迭代公式现已知迭代公式,确定迭代变量初始值,只要控制迭代增量绝对值小于0.00001
代码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main(){
double x1, x2;
float a;
printf("请输入a的值:");
scanf("%f", &a);
//迭代变量随意,只要不取0,因为不满足迭代式中的分母不为0
x2 = 10;
do{
x1 = x2;
x2 = (x1 + a / x1) / 2.0;
} while (fabs(x1 - x2) >= 0.00001);
printf("%f", x2);
system("pause");
return 0;
}
结果:
题目:
用牛顿迭代公式求下面方程在1.5附近的根。
代码;
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main(){
//迭代初值,x0=1.5
double f,f1,x,x0 = 1.5;
do{
//将迭代初量代入迭代方程中计算f(x0),f'(x)
f = 2 * pow(x0,3) - 4 * pow(x0 ,2 )+ 3 * x0- 6;
f1 = 6 * pow(x0, 2) - 8 * x0 + 3;
//计算下一个x x= x0 - f / f1;
x= x0 - f / f1;
//将新产生的x替换x0,为下一次迭代做好准备
x0 = x;
} while (fabs(f/f1) > 0.00001);//迭代增量大于0.00001,再继续直到小于这个范围
printf("%f", x);
system("pause");
return 0;
}
结果:
二分法;
在给定的定义域内选取两点,一点带入函数里的使函数大于0,一点代入函数里函数小于0,即两点函数值相乘小于0,取两点的中点,带入函数,判断值大于0还是小于0,若大于0则用中点代替函数值大于0的点,若小于0,则用中点代替函数值小于0的点,一直循环下去直到找到零点或者零点误差很小的点
题目:
用二分法求下面方程在(-10,10)之间的根 2x3-4x2+3x-6=0
代码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main(){
float x0,x1,x2,f0=0,f1=0,f2=0;
do{
printf("please inter two numbers x1,x2:");
//在定义域内取值x1,x2使其所对应的值函数值f1,f2一个大于0,一个小于0,满足而二分法求零点
scanf("%f %f", &x1, &x2);
//代x1,求f1的值
f1 = 2 * pow(x1, 3) - 4 * pow(x1, 2) + 3 * x1- 6;
//代x2,求f2的值
f2 = 2 * pow(x2, 3) - 4 * pow(x2, 2) + 3 * x2 - 6;
} while(f1*f2 >0);//当满足两点函数值异号,即两点函数值<=0,跳出循环
do{
//当找到两点函数值异号时,求其中点x0
x0 = (x1 + x2) / 2;
//求中点x0函数值f0
f0 = 2 * pow(x0, 3) - 4 * pow(x0, 2) + 3 * x0 - 6;
//若f0,f1异号,则说明x0可以代替x2
if (f0*f1 < 0){
x2 = x0;
f2 = f0;
}
//若f0,f2异号,则说明x0可以代替x1
else{
x1 = x0;
f1 = f0;
}
} while(fabs(f0)>0.00001);//直到零点(以求点)误差很小时跳出循环,通常为绝对值小于10^(-5)
printf("%f\n", x0);
system("pause");
return 0;
}
结果:
结语:如有不足,请多包涵。