计算方法--二分法和牛顿迭代法求解非线性方程的根


f(x) = x^3 -sin(x) -4*x + 1函数图像



#include<stdio.h>
#include<math.h>
#include<conio.h>

float f(float x) {
 float result = x*x*x - sin(x) - 4 * x  + 1;
 return result;
}

char ff(float a, float b) {
 float r = a + b;
 return f(r/2)>0?'>':'<';
}

/************************************
*二分法求解方程的解
*二分法求解不管[a,b]区间有多大,它总是能过求解,只要函数连续即可 
*但局限性是:只能用于求解函数的是跟不能用于求复根和重根 
************************************/ 
void erFen(float a, float b, float ex) {
 
	 int i = 1;
	 float x;
	 do {
	  
	  printf("第%d次--[%f,%f]--%c--%f\n", i++,a,b,ff(a,b),fabs(b-a));
	  x = (a + b) / 2;
	  if(f(x) * f(a) < 0) {
	   b= x;
	  }else {
	   a = x;
	  }
	  
	  
	 }while(fabs(b -a) > ex);
	 
	 printf("%f\n", x); 
	 
}
/*************************************************
*牛顿迭代法求函数解 
*牛顿迭代法是求解非线性f(x) = 0的一种常用方法
*基本思想就是将非线性函数逐步线性化,是一种近似求解的方法 
*根据泰勒展开公式
*任何一个函数都可以写成他f(x) = ∑an*x^n的形式 
*************************************************/
//求f(x) = x^3 - sin(x) - 4x + 1的导函数 
float df(float x) {
	float result = 3 * x * x - cos(x) - 4; 
	return result;
}

void Newton(float x, float ex) {
	int maxValue = 1000;
	float x1;
	int k = 1;
	for (;k < maxValue; k++) {
		if(0 == df(x)) {
			printf("erro");
			break;	
		} else {
			x1 = x - f(x)/df(x);
			if(fabs(x1- x) < ex) {
				printf("%f",x1);
				break;
			}
			printf("第%d次误差---%f\n",k,fabs(x1-x));
			x = x1;
		}
	}
	return;	 
} 
int main() {
 
	 float a,b,ex;
	 float x;
	 int i = 1;
	 
	 a = -3.0;
	 b = -2.0;	 
	 ex = 0.000001;
	 
	 erFen(a,b,ex);
         //根据图像可以先给出一个近似解-3.0
	 Newton(-3,ex);
 
 	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值