poj1905——二分法求单调函数零点解方程

poj1905——二分法求单调函数零点解方程

Expanding Rods

Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 12773   Accepted: 3291

Description

When a thin rod of length L is heated n degrees, it expands to a new length L‘=(1+n*C)*L, where C is the coefficient of heat expansion. 
When a thin rod is mounted on two solid walls and then heated, it expands and takes the shape of a circular segment, the original rod being the chord of the segment.

Your task is to compute the distance by which the center of the rod is displaced.

Input

The input contains multiple lines. Each line of input contains three non-negative numbers: the initial lenth of the rod in millimeters, the temperature change in degrees and the coefficient of heat expansion of the material. Input data guarantee that no rod expands by more than one half of its original length. The last line of input contains three negative numbers and it should not be processed.

Output

For each line of input, output one line with the displacement of the center of the rod in millimeters with 3 digits of precision.

Sample Input

1000 100 0.0001
15000 10 0.00006
10 0 0.001
-1 -1 -1

Sample Output

61.329
225.020
0.000题意:长度为L的铁片如图所示,升高温度C后会有一定程度的形变,长度变为NewL,呈圆弧状,求铁片中点偏离的高度思路:数学题,解方程时构造函数二次求导求变化趋势,二分确定零点范围,怀念高考前刷数学试卷做导数题的时光。此题需注意精度以及数据为0的特判。

/**
 * Start at 12:53
 * End at 13:08
 * Problem: poj1905
 * Author: __560
 */
 #include<iostream>
 #include<cstdio>
 #include<cstring>
 #include<cstdlib>
 #include<algorithm>
 #include<math.h>

 using namespace std;

 const int maxn=1000100;
 const int INF=(1<<28);
 const double Pi=3.1415927;
 const double Exp=0.000000000001;

 double L,T,C;
 double NewL;

 double f(double x)
 {
     return L*x-NewL*sin(x);
 }

 double BinSearch(double left,double right)
 {
     while(fabs(left-right)>Exp){
        double mid=(left+right)/2;
        if(f(mid)<0) left=mid;
        else if(mid>0) right=mid;
     }
     return left;
 }

 int main()
 {
     while(scanf("%lf%lf%lf",&L,&T,&C)!=EOF){
        if(L==-1&&T==-1&&C==-1) return 0;
        if(L==0||T==0||C==0) puts("0.000");
        else{
            NewL=(1+C*T)*L;
            double x=BinSearch(Exp,Pi);
            double R=NewL/(2*x);
            double d=sqrt(R*R-L*L/4);
            printf("%.3f\n",R-d);
        }
     }
 }

				
时间: 2024-10-10 23:22:49

poj1905——二分法求单调函数零点解方程的相关文章

Openjudge ch0111/t6253 用二分法求方程的根

这题只是考你最后有没有(r-l)/2而已…… 总时间限制: 1000ms 内存限制: 65536kB 描述 用二分法求下面方程在(-10, 10)之间的一个根. 2x3- 4x2+ 3x- 6 = 0 输入 一个小于1的非负实数e,它的值表示所能允许的误差 输出 一个实数,其值为求得的一个根,要求精确到小数点后8位.若该区间上没有根,则输出“No Solution” 样例输入 0 样例输出 2.00000000 提示 对于一个连续函数f(x),若f(a)*f(b) <= 0,则f(x)在区间[a

用二分法求下面方程在(-10,10)之间的根。【谭浩强第四版课后习题】

用二分法求下面方程在(-10,10)之间的根:2x3-4x2+3x-6=0 编程思路:仿照二分查找,将区间划分为两部分,记录区间左右端点,得到中点.每次运算将中点带入方程: 结果>0:根应该向小一点的值拟合,high=mid; 结果<0:根应该向大一点的值拟合,low=mid; 对于跳出循环的条件,我首先是认为low和high应该无限逼近:while(fabs(low-high)>1e-5),当循环体内结果=0后,便使用break跳出循环:if(temp==0) break;但是没有得到

02:二分法求函数的零点

http://noi.openjudge.cn/ch0111/02/ 02:二分法求函数的零点 总时间限制:  1000ms 内存限制:  65536kB 描述 有函数: f(x) = x5 - 15 * x4+ 85 * x3- 225 * x2+ 274 * x - 121 已知 f(1.5) > 0 , f(2.4) < 0 且方程 f(x) = 0 在区间 [1.5,2.4] 有且只有一个根,请用二分法求出该根. 输入 无. 输出 该方程在区间[1.5,2.4]中的根.要求四舍五入到小

4142:二分法求函数的零点(二分查找)

查看 提交 统计 提示 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 有函数: f(x) = x5 - 15 * x4+ 85 * x3- 225 * x2+ 274 * x - 121 已知 f(1.5) > 0 , f(2.4) < 0 且方程 f(x) = 0 在区间 [1.5,2.4] 有且只有一个根,请用二分法求出该根. 输入 无. 输出 该方程在区间[1.5,2.4]中的根.要求四舍五入到小数点后6位. 样例输入 无 样例输出 1.849016 只输出结果

03-1. 二分法求多项式单根

二分法求函数根的原理为:如果连续函数f(x)在区间[a, b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f(r)=0. 二分法的步骤为: 检查区间长度,如果小于给定阈值,则停止,输出区间中点(a+b)/2:否则 如果f(a)f(b)<0,则计算中点的值f((a+b)/2): 如果f((a+b)/2)正好为0,则(a+b)/2就是要求的根:否则 如果f((a+b)/2)与f(a)同号,则说明根在区间[(a+b)/2, b],令a=(a+b)/2,重复循环:

中国大学MOOC-陈越、何钦铭-数据结构基础习题集 03-1. 二分法求多项式单根

03-1. 二分法求多项式单根(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 杨起帆(浙江大学城市学院) 二分法求函数根的原理为:如果连续函数f(x)在区间[a, b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f(r)=0. 二分法的步骤为: 检查区间长度,如果小于给定阈值,则停止,输出区间中点(a+b)/2:否则 如果f(a)f(b)<0,则计算中点的值f((a+b)/2): 如

二分法求函数值的Pascal实现

用二分法求在(a,b)上单调的函数近似值 第八行的表达式可更改,第三行的kexi决定的精度,小数值计算可将第五行的extended更为real或double PROGRAM EQUANTION (input,output); CONST kexi=0.0000001; VAR a,b,c:extended; FUNCTION fx(x:extended):extended; BEGIN fx:=ln(x)/ln(2); END; BEGIN writeln('Please input a and

03-1. 二分法求多项式单根(PAT)

二分法求函数根的原理为:如果连续函数f(x)在区间[a, b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f(r)=0. 二分法的步骤为: 检查区间长度,如果小于给定阈值,则停止,输出区间中点(a+b)/2:否则 如果f(a)f(b)<0,则计算中点的值f((a+b)/2): 如果f((a+b)/2)正好为0,则(a+b)/2就是要求的根:否则 如果f((a+b)/2)与f(a)同号,则说明根在区间[(a+b)/2, b],令a=(a+b)/2,重复循环:

PAT03-1. 二分法求多项式单根(20)

链接:点击打开链接 题意: 二分法求函数根的原理为:如果连续函数f(x)在区间[a, b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f(r)=0. 二分法的步骤为: 检查区间长度,如果小于给定阈值,则停止,输出区间中点(a+b)/2:否则 如果f(a)f(b)<0,则计算中点的值f((a+b)/2): 如果f((a+b)/2)正好为0,则(a+b)/2就是要求的根:否则 如果f((a+b)/2)与f(a)同号,则说明根在区间[(a+b)/2, b],令a=