博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
三分法
阅读量:7090 次
发布时间:2019-06-28

本文共 1695 字,大约阅读时间需要 5 分钟。

2017-08-06     22:47:36 

区别于二分法 , 二分法只适用于单调函数 (在一个单调的序列中对某一个元素进行查找)

三分法  突破了这种限制 , 可以用于凸函数或凹函数 , 这是因为凸函数或凹函数必存在一个最值

 

  三分 顾名思义 要将一个线段分成 3 份 , 可以以线段 1/3  与  2/3 的位置 作为 3 分的 基准 ,将此函数分为3段 , 再分别计算 lm  与  lr  所对应的值 , 将较小的一侧全部舍去 , 并且重新赋予 left 与 right ,  一直重复此过程下去 , 直到 right - left > 1e-7 。此时被分割的线段可以近似看成一个点 , 也就是此函数的极值 。

 

代码示例

  

double f( int x ) {    return f(x) ;   // f(x) 则代表所要三分的函数 }double sf ( int left , int right ) {  // 三分求最大值     double lm , lr ;   // 定义两个三分的中间变量         while ( right - left > 1e-7 ) {  // 当最三分的线段无线小时 , 此时近似为一个点 , 即函数的最值         lm = l + ( right - left ) / 3.0 ;   // 选取线段的 1/3 点为一个基准点         lr = r - ( right - left ) / 3.0 ;     // 选取线段的 2/3 点为另一个基准点            if ( f(lm) > f(lr) ) right = lr ;            else left = lm ;          }        return left ;    // 此时被三分的线段无线小 , 因此任意返回一个点就行 }

 

/***********/  特别注意下  上面的精度控制 right - left > 1e-7 , 1e-7 的精度可能并不符合题目要求 , 有两种方法解决 , 一是将精度提升为 1e-10 , 二是直接三分 100 次函数 。

 

例题 示例 :  http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3203

问题分析 :

    题目所求影子的长度 , 包括两部分 地上的和墙上的 或者  人较靠左站 ,只在地上有影子 ,想要有最长的影子 , 显然是考虑人的影子同时出现在墙上和地上的情况  。推导出公式 , 进而求解 。

 

代码示例 :

#include 
#include
using namespace std ;double H , h , d ; double f( double x ) { double ans = ( x - d ) * ( H - h ) * 1.0 / x + h + d - x ; return ans ;}int main ( ) { int t ; double lm , lr ; while ( cin >> t ) { while ( t-- ) { cin >> H >> h >> d ; double l = d * ( H -h ) / H , r = d ; while ( r - l > 1e-9 ) { lm = l + 1.0 / 3 * ( r - l ) ; lr = r - 1.0 / 3 * ( r - l ) ; if ( f(lm) >= f(lr) ) r = lr ; else l = lm ; } printf ( "%.3f\n" , f(lm) ) ; } } return 0 ;}

 

  

 

转载于:https://www.cnblogs.com/ccut-ry/p/7295776.html

你可能感兴趣的文章
android应用要搞起了
查看>>
一个简单的css3 动画例子
查看>>
关于几道SQL经典题详解
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
Facebook ATC 弱网测试项目部署
查看>>
关于p-vol和s-vol
查看>>
一八年第三天晚上十点半的thinking
查看>>
ksh和bash区别
查看>>
keepalived 组播的配置
查看>>
华为路由器交换机配置相关功能
查看>>
谷歌收购眼球追踪技术公司Eyefluence,眼动关注度将成为VR的新视角
查看>>
【蜕变之路】第32天 使用STS创建SpringBoot项目 (2019年3月22日)
查看>>
Oracle之数据挖掘的更新介绍
查看>>
NFS
查看>>
Exception异常处理
查看>>
第二十讲 任务的挂起和恢复
查看>>
emmm算是来了
查看>>
do…while语句
查看>>
网络工程师成长日记413-长安大学交换机项目
查看>>