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;
}