<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>划界 &#8211; 编码无悔 /  Intent &amp; Focused</title>
	<atom:link href="https://www.codelast.com/tag/%E5%88%92%E7%95%8C/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.codelast.com</link>
	<description>最优化之路</description>
	<lastBuildDate>Mon, 27 Apr 2020 17:29:07 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>[原创]一维搜索中的划界(Bracket)算法</title>
		<link>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e4%b8%80%e7%bb%b4%e6%90%9c%e7%b4%a2%e4%b8%ad%e7%9a%84%e5%88%92%e7%95%8cbracket%e7%ae%97%e6%b3%95/</link>
					<comments>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e4%b8%80%e7%bb%b4%e6%90%9c%e7%b4%a2%e4%b8%ad%e7%9a%84%e5%88%92%e7%95%8cbracket%e7%ae%97%e6%b3%95/#comments</comments>
		
		<dc:creator><![CDATA[learnhard]]></dc:creator>
		<pubDate>Sat, 26 Oct 2013 15:30:03 +0000</pubDate>
				<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[Math]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[bracket]]></category>
		<category><![CDATA[line search]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[一维搜索]]></category>
		<category><![CDATA[划界]]></category>
		<category><![CDATA[最优化]]></category>
		<guid isPermaLink="false">http://www.codelast.com/?p=7360</guid>

					<description><![CDATA[<p>
很多最优化算法需要用到一维搜索（line search）子算法，而在众多的一维搜索算法中，大多数都要求函数被限制在一个<span style="color:#0000ff;">单峰区间</span>内，也就是说，在进行一维搜索的区间内，函数是一个<span style="color:#0000ff;">单峰函数</span>。尽管有一些改进的一维搜索算法（例如 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_c4be180680b4bf5c21034b5f7bf163d8.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="H\ddot opfinger" /></span><script type='math/tex'>H\ddot opfinger</script> 建议的一种改进过的黄金搜索算法）可以处理函数非单峰的情况，但是，在没有确定函数在一个区间内是单峰的之前，即使在搜索过程中，函数值持续减小，我们也不能说极小值是一定存在的，因此，找出一个区间，在此区间之内使函数是单峰的，这个过程是必需的（我更倾向于接受这种观点）。这个过程就叫作<span style="color:#ff0000;">划界</span>（<span style="color:#0000ff;">Bracket</span>）。Bracket这个单词是括号的意思，很形象&#8212;&#8212;用括号包住一个范围，就是划界。在某些书中，划界算法也被称为<span style="color:#0000ff;">进退法</span>。<br />
<span id="more-7360"></span><br />
<span style="background-color:#00ff00;">【1】</span>什么是单峰区间？什么是单峰函数？<br />
从字面上理解，&#8220;单峰&#8221;即函数只有一个峰，如下图所示（在区间[-8,8]内是单峰的）：</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_bracket_1.png" style="width: 309px; height: 153px;" /></div>
<p><span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
而下面的这个函数，在区间[2,14]内就不是单峰函数了：</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_bracket_2.png" style="width: 462px; height: 129px;" /></div>
<p>现在，我们再用数学的话来定义一下单峰区间和单峰函数：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2c3d331bc98b44e71cb2aae9edadca7e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[a,b]" /></span><script type='math/tex'>[a,b]</script> 为 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_e1e1d3d40573127e9ee0480caf1283d6.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="R" /></span><script type='math/tex'>R</script> 的子集，存在 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_e48ac27bb5429028836b36729e3bfc66.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\alpha ^*} \in [a,b]" /></span><script type='math/tex'>{\alpha ^*} \in [a,b]</script> ，使得 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8f3c9b4ae0bcdfe45aeb49f027941ddd.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(\alpha )" /></span><script type='math/tex'>f(\alpha )</script> 在 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_bfc3057d694a9b06bb46943bf39a0e7b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[a,{\alpha ^*}]" /></span><script type='math/tex'>[a,{\alpha ^*}]</script> 上严格单调减，在 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_ead4fb17a0c4148758ef1619b8d9f56a.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[{\alpha ^*},b]" /></span><script type='math/tex'>[{\alpha ^*},b]</script> 上严格单调增，则称 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2c3d331bc98b44e71cb2aae9edadca7e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[a,b]" /></span><script type='math/tex'>[a,b]</script> 是 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8f3c9b4ae0bcdfe45aeb49f027941ddd.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(\alpha )" /></span><script type='math/tex'>f(\alpha )</script> 的单峰区间，  <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8f3c9b4ae0bcdfe45aeb49f027941ddd.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(\alpha )" /></span><script type='math/tex'>f(\alpha )</script> 是 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2c3d331bc98b44e71cb2aae9edadca7e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[a,b]" /></span><script type='math/tex'>[a,b]</script> 上的单峰函数。<br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a>&#8230; <a href="https://www.codelast.com/%e5%8e%9f%e5%88%9b%e4%b8%80%e7%bb%b4%e6%90%9c%e7%b4%a2%e4%b8%ad%e7%9a%84%e5%88%92%e7%95%8cbracket%e7%ae%97%e6%b3%95/" class="read-more">Read More </a></p>]]></description>
										<content:encoded><![CDATA[<p>
很多最优化算法需要用到一维搜索（line search）子算法，而在众多的一维搜索算法中，大多数都要求函数被限制在一个<span style="color:#0000ff;">单峰区间</span>内，也就是说，在进行一维搜索的区间内，函数是一个<span style="color:#0000ff;">单峰函数</span>。尽管有一些改进的一维搜索算法（例如 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_c4be180680b4bf5c21034b5f7bf163d8.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="H\ddot opfinger" /></span><script type='math/tex'>H\ddot opfinger</script> 建议的一种改进过的黄金搜索算法）可以处理函数非单峰的情况，但是，在没有确定函数在一个区间内是单峰的之前，即使在搜索过程中，函数值持续减小，我们也不能说极小值是一定存在的，因此，找出一个区间，在此区间之内使函数是单峰的，这个过程是必需的（我更倾向于接受这种观点）。这个过程就叫作<span style="color:#ff0000;">划界</span>（<span style="color:#0000ff;">Bracket</span>）。Bracket这个单词是括号的意思，很形象&mdash;&mdash;用括号包住一个范围，就是划界。在某些书中，划界算法也被称为<span style="color:#0000ff;">进退法</span>。<br />
<span id="more-7360"></span><br />
<span style="background-color:#00ff00;">【1】</span>什么是单峰区间？什么是单峰函数？<br />
从字面上理解，&ldquo;单峰&rdquo;即函数只有一个峰，如下图所示（在区间[-8,8]内是单峰的）：</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_bracket_1.png" style="width: 309px; height: 153px;" /></div>
<p><span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
而下面的这个函数，在区间[2,14]内就不是单峰函数了：</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_bracket_2.png" style="width: 462px; height: 129px;" /></div>
<p>现在，我们再用数学的话来定义一下单峰区间和单峰函数：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2c3d331bc98b44e71cb2aae9edadca7e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[a,b]" /></span><script type='math/tex'>[a,b]</script> 为 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_e1e1d3d40573127e9ee0480caf1283d6.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="R" /></span><script type='math/tex'>R</script> 的子集，存在 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_e48ac27bb5429028836b36729e3bfc66.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\alpha ^*} \in [a,b]" /></span><script type='math/tex'>{\alpha ^*} \in [a,b]</script> ，使得 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8f3c9b4ae0bcdfe45aeb49f027941ddd.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(\alpha )" /></span><script type='math/tex'>f(\alpha )</script> 在 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_bfc3057d694a9b06bb46943bf39a0e7b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[a,{\alpha ^*}]" /></span><script type='math/tex'>[a,{\alpha ^*}]</script> 上严格单调减，在 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_ead4fb17a0c4148758ef1619b8d9f56a.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[{\alpha ^*},b]" /></span><script type='math/tex'>[{\alpha ^*},b]</script> 上严格单调增，则称 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2c3d331bc98b44e71cb2aae9edadca7e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[a,b]" /></span><script type='math/tex'>[a,b]</script> 是 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8f3c9b4ae0bcdfe45aeb49f027941ddd.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(\alpha )" /></span><script type='math/tex'>f(\alpha )</script> 的单峰区间，  <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8f3c9b4ae0bcdfe45aeb49f027941ddd.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(\alpha )" /></span><script type='math/tex'>f(\alpha )</script> 是 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2c3d331bc98b44e71cb2aae9edadca7e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[a,b]" /></span><script type='math/tex'>[a,b]</script> 上的单峰函数。<br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
<span style="background-color: rgb(0, 255, 0);">【2】</span>&ldquo;划界&rdquo;是如何实现的<br />
方法是：<span style="color:#0000ff;">寻找使函数值达到&ldquo;高&rarr;低&rarr;高&rdquo;的3个点</span>。</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_bracket_3.png" style="width: 300px; height: 153px;" /></div>
<p>如上图所示，当我们找到 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_a44c56c8177e32d3613988f4dba7962e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="a,b,c" /></span><script type='math/tex'>a,b,c</script> 这样3个点的时候，它们就能确定一个单峰区间了。<br />
一定有人会有疑问说：这不一定，万一 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_74aefa13d6ab8e4bfbd241583749dfe8.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="b,c" /></span><script type='math/tex'>b,c</script> 之间还有一个峰怎么办？确实，这里举的例子并不是一个完善的例子，在一个实用的划界程序中，它所做的考虑会非常多，各种意外情况都要处理，此处只是为了说明&ldquo;划界&rdquo;是怎么一回事，以及一个最简单的划界程序是怎么做的。<br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
与各种教科书上仅有令人讨厌的公式说明不同（从不考虑读者的感受），我把几个简单的划界步骤画成了几幅图，我觉得有小学文凭已经足够理解了（一图胜千言）：<br />
<span style="background-color:#dda0dd;">①</span>：</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_bracket_4.png" style="width: 400px; height: 255px;" /></div>
<p><span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
起始点为 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_892581f6aefecae90be73076e1aeee5c.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_0}" /></span><script type='math/tex'>{x_0}</script> ，假设一开始向右寻找，步长为 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2510c39011c5be704182423e3a695e91.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="h" /></span><script type='math/tex'>h</script> ，图中的 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8ce4b16b22b58894aa86c421e8759df3.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="k" /></span><script type='math/tex'>k</script> 表示迭代的次数。<br />
则第一点挪动到了 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_83c84950d6ab71b491310cf6fdeff6e1.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_1} = {x_0} + h" /></span><script type='math/tex'>{x_1} = {x_0} + h</script> ，计算函数值，发现 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_c0260b46fc02a40358b1ce8d6a091d49.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_1}) < f({x_0})" /></span><script type='math/tex'>f({x_1}) < f({x_0})</script> ，很好，&ldquo;高&rarr;低&rarr;高&rdquo;的3点中，我们已经有了两点。<br />
然后下一点我们挪动到 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_418ef5b163ae9806a8083c9a9d2d1b60.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_2} = {x_1} + t \times h,\;t > 1" /></span><script type='math/tex'>{x_2} = {x_1} + t \times h,\;t > 1</script> ，这里用加倍系数 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_e358efa489f58062f10dd7316b65649e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="t" /></span><script type='math/tex'>t</script> 来乘以步长是为了加速搜索的过程。再计算函数值，发现 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_6eddd6e29b72e5f6800d8ff6ce721536.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_2}) > f({x_1})" /></span><script type='math/tex'>f({x_2}) > f({x_1})</script> ，很好，我们已经找到了&ldquo;高&rarr;低&rarr;高&rdquo;的3点。任务完成， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2c3d331bc98b44e71cb2aae9edadca7e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[a,b]" /></span><script type='math/tex'>[a,b]</script> 即为所求区间。<br />
总结一下步骤就是：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_83c84950d6ab71b491310cf6fdeff6e1.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_1} = {x_0} + h" /></span><script type='math/tex'>{x_1} = {x_0} + h</script> <br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_16eed244bae8cda67b7b4b3d247524df.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_2} = {x_1} + t \times h" /></span><script type='math/tex'>{x_2} = {x_1} + t \times h</script> <br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
<span style="background-color:#dda0dd;">②</span>：<br />
如果运气没那么好，例如：</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_bracket_5.png" style="width: 400px; height: 258px;" /></div>
<p><span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
即：<br />
和①一样，搜索也经历了 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2a028522a51821f6a7a0d441ef3385f5.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_0},{x_1},{x_2}" /></span><script type='math/tex'>{x_0},{x_1},{x_2}</script> 这几个点，与①不同的是，到了 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_c1015f14836165504ccbb2a42b2c150b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_2}" /></span><script type='math/tex'>{x_2}</script> 点之后，我们发现其函数值仍然小于 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_802914d74c5ec475b03d8e01114b4af4.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_1}" /></span><script type='math/tex'>{x_1}</script> 点处的函数值，也就是说，我们还没有找到&ldquo;高&rarr;低&rarr;高&rdquo;的3点。<br />
于是我们继续放大步长，令 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_aa04b6cd962ee49fac0ad911b765d710.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_3} = {x_2} + t \times t \times h" /></span><script type='math/tex'>{x_3} = {x_2} + t \times t \times h</script> ，再计算函数值，发现 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_434ea99ec939be08994d39367fd9d146.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_3}) > f({x_2})" /></span><script type='math/tex'>f({x_3}) > f({x_2})</script> ，很好，我们已经找到了&ldquo;高&rarr;低&rarr;高&rdquo;的3点。任务完成， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2c3d331bc98b44e71cb2aae9edadca7e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[a,b]" /></span><script type='math/tex'>[a,b]</script> 即为所求区间。<br />
总结一下步骤就是：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_83c84950d6ab71b491310cf6fdeff6e1.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_1} = {x_0} + h" /></span><script type='math/tex'>{x_1} = {x_0} + h</script> <br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_16eed244bae8cda67b7b4b3d247524df.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_2} = {x_1} + t \times h" /></span><script type='math/tex'>{x_2} = {x_1} + t \times h</script> （加大步长）<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_aa04b6cd962ee49fac0ad911b765d710.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_3} = {x_2} + t \times t \times h" /></span><script type='math/tex'>{x_3} = {x_2} + t \times t \times h</script> （继续加大步长）<br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
<span style="background-color: rgb(221, 160, 221);">③</span>：<br />
①是向右搜索，如果我们运气更差一些，一开始就是个错误（应该向左搜索），怎么办？</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_bracket_6.png" style="width: 400px; height: 256px;" /></div>
<p><span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
如上图，起始点为 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_892581f6aefecae90be73076e1aeee5c.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_0}" /></span><script type='math/tex'>{x_0}</script> ，第一个挪动到的点起始点为 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_802914d74c5ec475b03d8e01114b4af4.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_1}" /></span><script type='math/tex'>{x_1}</script> ，而 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_802914d74c5ec475b03d8e01114b4af4.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_1}" /></span><script type='math/tex'>{x_1}</script> 处的函数值竟然比起始点 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_892581f6aefecae90be73076e1aeee5c.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_0}" /></span><script type='math/tex'>{x_0}</script> 处的函数值要大（函数值不降反升）。于是我们可以向左搜索（将步长 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2510c39011c5be704182423e3a695e91.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="h" /></span><script type='math/tex'>h</script> 设为负值），并且把 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_802914d74c5ec475b03d8e01114b4af4.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_1}" /></span><script type='math/tex'>{x_1}</script> 挪到 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_892581f6aefecae90be73076e1aeee5c.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_0}" /></span><script type='math/tex'>{x_0}</script> ，继续按①的节奏进行下去。<br />
总结一下步骤就是：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_83c84950d6ab71b491310cf6fdeff6e1.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_1} = {x_0} + h" /></span><script type='math/tex'>{x_1} = {x_0} + h</script> （发现函数值不降反升）<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_761bf3e16011552f691e8ecbe1f52d9c.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="h' = - h" /></span><script type='math/tex'>h' = - h</script> （步长设为负值，向左搜索）<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_49c03e6e72258ffeeb5c461e0983f30b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_1} = {x_0}" /></span><script type='math/tex'>{x_1} = {x_0}</script> （重置 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_802914d74c5ec475b03d8e01114b4af4.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_1}" /></span><script type='math/tex'>{x_1}</script> 点）<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_98d08c4623b6deffb01ecc0f74005111.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_2} = {x_1} + h'" /></span><script type='math/tex'>{x_2} = {x_1} + h'</script> <br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_5fdd5a736e805b777b0290ce5be54185.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_3} = {x_2} + t \times h'" /></span><script type='math/tex'>{x_3} = {x_2} + t \times h'</script> （加大步长，函数值回升，停止搜索）<br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
<span style="background-color: rgb(0, 255, 0);">【3】</span>加快划界的速度：逆抛物内插<br />
有没有什么办法可以加快划界的速度呢？有，<span style="color:#ff0000;">逆抛物内插</span>（<span style="color:#0000ff;">Inverse Parabolic Interpolation</span>）就是一种技术，它可以使得划界算法<span style="color:#0000ff;">超线性收敛</span>。<br />
为了解释什么是逆抛物内插，这里用书上的一幅图来讲解：</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_bracket_7.png" style="width: 450px; height: 322px;" /></div>
<p><span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
如图，实线为目标函数曲线。在该曲线上，如果我们要尽快逼近极小值点，可以这样做：通过①②③三点作一条抛物线（图中粗虚线所示），可以计算出该抛物线的极小值点的<span style="color:#b22222;">横坐标</span>，从而可以找到同一横坐标下，目标函数上的点，即点④；然后再过①②④三点作一条抛物线（图中细虚线所示），可以计算出该抛物线的极小值点的横坐标，从而又可以找到同一横坐标下，目标函数上的点，即点⑤。这样，我们就很快地逼近了极小值。</p>
<p>那么，过三点的抛物线，其极小值点的横坐标怎么求？<br />
已知函数 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_50bbd36e1fd2333108437a2ca378be62.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(x)" /></span><script type='math/tex'>f(x)</script> ，过 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8ca1651768f9a28ea5d93fc636ac68c0.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(a),f(b),f(c)" /></span><script type='math/tex'>f(a),f(b),f(c)</script> 三点的抛物线，其极小值点的横坐标 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_9dd4e461268c8034f5c8564e155c67a6.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="x" /></span><script type='math/tex'>x</script> 为：<br />
<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_bracket_8.png" style="width: 550px; height: 74px;" /><br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
注：为什么叫&ldquo;<span style="color:#ff0000;">逆</span>&rdquo;？因为上面的方法是用来求横坐标 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_9dd4e461268c8034f5c8564e155c67a6.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="x" /></span><script type='math/tex'>x</script> ，而不是求 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_415290769594460e2e485922904f345d.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="y" /></span><script type='math/tex'>y</script> 的。</p>
<p>有人会问：划界的目标就是找到3个点，而你怎么会预先知道3个点的坐标，从而进行逆抛物内插？这不是因果倒置了吗？<br />
其实，这里的三个点，并不是划界的结果，而是初始的猜测，通过初始的猜测点进行逆抛物内插，再根据内插点的不同情况，分别作不同的处理，最终可以找到划界的3个点。<br />
例如，我们总要知道两个初始点 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_b345e1dc09f20fdefdea469f09167892.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="a,b" /></span><script type='math/tex'>a,b</script> 吧？好吧，如果你已知的真的只有一个点 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_0cc175b9c0f1b6a831c399e269772661.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="a" /></span><script type='math/tex'>a</script> ，那么 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_92eb5ffee6ae2fec3ad71c777531578f.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="b" /></span><script type='math/tex'>b</script> 就随便取比 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_0cc175b9c0f1b6a831c399e269772661.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="a" /></span><script type='math/tex'>a</script> 大一点的值好了，这也能凑够两个点啊。通过这两个点，可以通过 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_4709d232f6de1eb5e3116dd8f7bf1226.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="c = b + COE \times (b - a)" /></span><script type='math/tex'>c = b + COE \times (b - a)</script> 来得到猜测的第一个 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_4a8a08f09d37b73795649038408b5f33.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="c" /></span><script type='math/tex'>c</script> 点（这里的 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_f10a915e958de33deceb8525ce3338b7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="COE" /></span><script type='math/tex'>COE</script> 表示一个系数，例如1.618），从而可以通过这3点开始逆抛物内插。<br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
一个实用的划界程序还是挺复杂的&mdash;&mdash;这里的复杂是比较于上面陈述的最简单的划界算法来说的，因为要保证程序在很多&ldquo;意外情况&rdquo;下都能正确运行，必须做很多工作。这里就不分析具体的程序了，大家可以到网上找来看一下。<br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="https://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">https://www.codelast.com/</span></a><br />
<span style="color: rgb(255, 0, 0);">➤➤</span>&nbsp;版权声明&nbsp;<span style="color: rgb(255, 0, 0);">➤➤</span>&nbsp;<br />
转载需注明出处：<u><a href="https://www.codelast.com/" rel="noopener noreferrer" target="_blank"><em><span style="color: rgb(0, 0, 255);"><strong style="font-size: 16px;"><span style="font-family: arial, helvetica, sans-serif;">codelast.com</span></strong></span></em></a></u>&nbsp;<br />
感谢关注我的微信公众号（微信扫一扫）：</p>
<p style="border: 0px; font-size: 13px; margin: 0px 0px 9px; outline: 0px; padding: 0px; color: rgb(77, 77, 77);">
	<img decoding="async" alt="wechat qrcode of codelast" src="https://www.codelast.com/codelast_wechat_qr_code.jpg" style="width: 200px; height: 200px;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e4%b8%80%e7%bb%b4%e6%90%9c%e7%b4%a2%e4%b8%ad%e7%9a%84%e5%88%92%e7%95%8cbracket%e7%ae%97%e6%b3%95/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
	</channel>
</rss>
