迭代技术--牛顿迭代

1.牛顿迭代

若f(x)=0在(a,b)内有一个零点α,在α的邻域内,|x-α|<ε,f ˊ(x)不等于0,且f″(x)存在,则从靠近α的任一点x0出发,构造计算序列xn+1=xn-f(xn)/f ˊ(xn)

2.弦截法

xk+1=xk-f(xk)* (xk-xk-1)/(f(xk)-f(xk-1)

 特点:若收敛,则收敛速度也较快,不须计算导数,但需要设置2个初值。

例:试对方程x2=c写出对应的牛顿迭代公式。

#include <stdio.h>
#include <math.h>
float c=16;
float newton(float a,float b);

int main(void){
	printf("root=%f\n",newton(0,1+c));
	return 0;
}

float f(float x){
	return x*x-c;
}

float d(float x){
	return 2*x;
}

float newton(float a,float b){
	float f(float x);
	float d(float x);
	float x0=(a+b)/2,x1;
	x1=x0-f(x0)/d(x0);
	while(fabs(x1-x0)>1e-6){
		x0=x1;
		x1=x0-f(x0)/d(x0);
	}
	return x0;
}

例:试编写自定义函数mysqrt,形式为float mysqrt(float x);它返回x的平方根。

#include <stdio.h>
float mysqrt(float x);

int main(void){
	printf("%f",mysqrt(8));
	return 0;
}

float mysqrt(float x){
	int s=x;
	while(x*x>s){
		x=(x+s/x)/2;
	}
	return x;
}

例:利用牛顿迭代公式,求解x2-3x-4=0在(1,6)之间的根。

方法一:

#include <stdio.h>
#include <math.h>
float newton(float a,float b);

int main(void){
	printf("%f",newton(1,6));
	return 0;
}

float newton(float a,float b){
	float f(float x);
	float d(float x);
	float x0=(a+b)*0.5,x1;
	x1=x0-f(x0)/d(x0);
	while(fabs(x1-x0)>1e-6){
		x0=x1;
		x1=x0-f(x0)/d(x0);
	}
	return x0;
}

float f(float x){
	return x*x-3*x-4;
}

float d(float x){
	return 2*x-3;
}

方法二:

#include <stdio.h>
#include <math.h>
float duifen(float a,float b);

int main(void){
	printf("root=%f",duifen(1,6));
	return 0;
}

float f(float x){
	return x*x-3*x-4;
}

float duifen(float a,float b){
	float f(float x);
	float m;
	while(fabs(a-b)>1e-6){
		m=(a+b)*0.5;
		if(f(a)*f(m)<0)b=m;
		if(f(m)*f(b)<0)a=m;
		if(fabs(f(m)-0)<=1e-5)return m;
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值