提高篇第20-21課第二題

#include <stdio.h>
#include <stdlib.h>
//第二題,二分法
/*1 確定區間[a, b], 驗證f(a)·f(b)<0   
	2 求區間(a, b)的中點c
	3 判斷
	(1) 若f(a)·f(c)<0, 則令b = c;
(2) 若f(c)·f(b)<0, 則令a = c.
	4 判斷f(c)是否達到精確度ξ:即若┃f(c)┃<ξ,則x = c就是使f(x)接近零點的近似值,否則重複2 - 4.*/
//思路分析
//1.如何確定函數的a b區間是難點,此函數爲三次函數,可知只有一個點使f(x)=0,故可以先找一個負數點,逐漸增加x令f(x)>0,從而確定一個基礎的範圍,但是如果是其他形式的函數可能有多個x軸交點
//上面的方法會漏解,大家有什麼好的思路,還要先列方程求出範圍麼T T
double fbs(double);
double f(double);
int main()
{
	double temp = 0;//顯然f(0)<0
	double a, b, c;
	while (f(temp) <= 0)
		temp=temp+1;//確定了基礎的[a,b]範圍爲[0,temp]
	a = 0;
	b = temp;
	c = (a + b) / 2;
	//printf("a=%lf,b=%lf,c=%lf",a,b,c);
	while (fbs(f(c)) > 1e-5)
	{
		if (f(a)*f(c) < 0)
			b = c;
		else if (f(b)*f(c) < 0)
			a = c;
		c = (a + b) / 2;
	}
	printf("方程的解爲%lf", c);
	return 0;
}
double f(double x)
{
	double result;
	result = x*x*x*2 - x*x*5 + x*3 - 6;
	return result;
}
double fbs(double x)
{
	double result;
	result = (x >= 0 ? x : -x);
	return result;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章