例题2.26 解方程 UVa10341

1.题目描述:点击打开链接

2.解题思路:本题要求解一个超越方程,通过观察发现,方程的前五项在区间[0,1]上单调递减,因此如果端点F(0)≤0或F(1)≥0,则无解。否则,一定有解。此时可以利用二分搜素来求出解。由于实数区间可以无限二分,因此通常是当区间长度小于特定值eps时终止,例如eps=1e-5;也可以当迭代次数超过一定值时终止,例如100次。

3.代码:

#define _CRT_SECURE_NO_WARNINGS 
#include<iostream>
#include<algorithm>
#include<string>
#include<sstream>
#include<set>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<deque>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#include<functional>
using namespace std;

int p, q, r, s, t, u;
double F(double x)
{
	return p*exp(-x) + q*sin(x) + r*cos(x) + s*tan(x) + t*x*x + u;
}
const double eps = 1e-14;
int main()
{
	//freopen("t.txt", "r", stdin);
	while (~scanf("%d%d%d%d%d%d", &p, &q, &r, &s, &t, &u))
	{
		double f0 = F(0), f1 = F(1);
		if (f1 > eps || f0 < -eps)printf("No solution\n");
		else
		{
			double x = 0, y = 1, m;
			for (int i = 0; i < 100; i++)//限制迭代次数
			{
				m = x + (y - x) / 2;
				if (F(m) < 0)y = m;
				else x = m;
			}
			printf("%.4lf\n", m);
		}
	}
	return 0;
}

你可能感兴趣的:(二分搜索,数值问题)