牛顿迭代法和二分法求根

牛顿迭代公式:
  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;
}

结果:
在这里插入图片描述
结语:如有不足,请多包涵。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值