<?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>無處不在</title>
	<atom:link href="http://blog.chaoskey.com/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.chaoskey.com</link>
	<description>一棵大树想要到达天空就必须进入最深的土壤，他的根必须进入地狱,深深进入,这样树顶才能达到天空。树必须接触到两者――地狱和天堂.--叔本华</description>
	<lastBuildDate>Thu, 19 Apr 2012 15:01:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>含跳跃的随机分析(Mathematica应用)</title>
		<link>http://blog.chaoskey.com/2012/04/19/201204192245</link>
		<comments>http://blog.chaoskey.com/2012/04/19/201204192245#comments</comments>
		<pubDate>Thu, 19 Apr 2012 15:01:02 +0000</pubDate>
		<dc:creator>混沌</dc:creator>
				<category><![CDATA[读书笔记]]></category>
		<category><![CDATA[mathematica]]></category>
		<category><![CDATA[Stochastic]]></category>
		<category><![CDATA[数学]]></category>
		<category><![CDATA[数理金融]]></category>
		<category><![CDATA[金融]]></category>
		<category><![CDATA[随机分析]]></category>

		<guid isPermaLink="false">http://blog.chaoskey.com/2012/04/19/201204192245</guid>
		<description><![CDATA[&#160;&#160;&#160; 在《随机分析库初实现(Mathematica应用)》中，实现的伊藤公式仅仅支持连续的随机过程，本文继续扩充到含跳跃随机过程的情况。 回顾半鞅下的伊藤公式 &#160;&#160;&#160; 再次回顾半鞅下，伊藤公式的最一般形式如下（包含了跳跃部分）： 为了一般性，考虑一个d维半鞅：,以及一个d+1元二次连续可微函数, 那么随机过程f(t,X)也是半鞅，并且 上式是伊藤公式的积分形式，在形式推演中，采用其微分形式更为方便： 注意：1)&#160; 代表的连续部分 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 2)&#160; 对于这个微分形式，在 Δf仅仅被理解为f的纯跳跃的情况下是不正确的。但是，如果我们对Δf进行二重理解：第二种理解，就Δf是f的纯跳部分的形式微分。 考虑到d[X,Y]=dX dY和和的形式关系,&#160; 为了形式推演的通用性，上述微分形式可以改写为： 注意：&#160; 代表的连续部分，在这个表达式中消失了。相应地，表达式多出两个纯跳跃的项。 随机分析库中伊藤公式的完整实现 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 假设《随机分析库初实现(Mathematica应用)》中的代码已经整理到StochasticAnalysis.m中，并且已经将该文件放置在Mathematica软件的合适目录下。为了继续下面的论述，需要先加载此随机分析库的实现： 补充一些记号 说明：用代表强度为λ的泊松过程，泊松过程不是鞅，但补偿泊松过程是鞅。 Δ代表严格意义上的纯跳跃，也代表纯跳过程的形式微分。 扩充和上述记号相关的运算法则 &#160;&#160;&#160;&#160;&#160; 说明：这些运算法则定义了如下这些关系 1） 2） 3）a(b==c)→ a b==a c 4)&#160;  =0,i≠j 5）X dY==0 6） 7） 含泊松跳跃的化简 &#160;&#160;&#160;&#160;&#160; 说明：由于泊松跳跃的二值性：{0,1},故有关系: &#160;&#160;&#160;&#160;&#160;&#160;&#160; PoissonSimplify功能就是利用这个关系进行化简。 跳跃的计算 &#160;&#160;&#160;&#160;&#160; 说明：上述规则就是将形如f[t,x[t],y[t],&#8230;]的表达式变换成f[t,x,y,...]， &#160;&#160;&#160;&#160;&#160;&#160;&#160; 然后调用后面的规则计算[f[t,x,y,..],t]==φ[t,x,y,...]， &#160;&#160;&#160;&#160;&#160;&#160;&#160; 最后再变回成φ[t,x[t],y[t],&#8230;] &#160;&#160;&#160;&#160;&#160; 说明：这两个规则表示 [...]]]></description>
			<content:encoded><![CDATA[<p>&#160;&#160;&#160; 在《<a href="http://blog.chaoskey.com/2012/04/13/201204121400" target="_blank">随机分析库初实现(Mathematica应用)</a>》中，实现的伊藤公式仅仅支持连续的随机过程，本文继续扩充到<strong><font color="#ff0000">含跳跃随机过程</font></strong>的情况。</p>
<p><span id="more-1283040"></span><br />
<hr />
<h1><font color="#0000ff">回顾半鞅下的伊藤公式</font></h1>
<p>&#160;&#160;&#160; 再次回顾半鞅下，<strong><font color="#ff0000">伊藤公式</font></strong>的最一般形式如下（包含了跳跃部分）：</p>
<p>为了一般性，考虑一个<em>d</em>维<strong><font color="#ff0000">半鞅</font></strong>：<img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_1" src="http://blog.chaoskey.com/files/2012/04/Mathematica_150.gif" width="103" height="21" />,以及一个d+1元二次连续可微函数<img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_2" src="http://blog.chaoskey.com/files/2012/04/Mathematica_213.gif" width="92" height="19" />, 那么随机过程f(t,X)也是半鞅，并且     <br /><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_3" src="http://blog.chaoskey.com/files/2012/04/Mathematica_313.gif" width="919" height="50" /></p>
<p>上式是伊藤公式的积分形式，在形式推演中，采用其微分形式更为方便：    <br /><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_4" src="http://blog.chaoskey.com/files/2012/04/Mathematica_410.gif" width="738" height="50" /></p>
<p>注意：1)&#160; <img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_5" src="http://blog.chaoskey.com/files/2012/04/Mathematica_510.gif" width="26" height="19" />代表<img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_6" src="http://blog.chaoskey.com/files/2012/04/Mathematica_610.gif" width="21" height="20" />的<strong><font color="#9b00d3">连续部分</font></strong>     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 2)&#160; 对于这个微分形式，在<em> </em>Δf仅仅被理解为f的<strong><font color="#9b00d3">纯跳跃</font></strong>的情况下是不正确的。但是，如果我们对Δf进行二重理解：第二种理解，就Δf是f的<strong><font color="#9b00d3">纯跳部分的形式微分</font></strong>。</p>
<p>考虑到<strong><font color="#ff0000">d[X,Y]=dX dY</font></strong>和<img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_7" src="http://blog.chaoskey.com/files/2012/04/Mathematica_710.gif" width="128" height="19" />和<img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_8" src="http://blog.chaoskey.com/files/2012/04/Mathematica_810.gif" width="234" height="29" />的形式关系,&#160; 为了形式推演的通用性，上述微分形式可以改写为：</p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_9" src="http://blog.chaoskey.com/files/2012/04/Mathematica_910.gif" width="774" height="135" /></p>
<p>注意：&#160; 代表<img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_10" src="http://blog.chaoskey.com/files/2012/04/Mathematica_1010.gif" width="21" height="20" />的连续部分<img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_11" src="http://blog.chaoskey.com/files/2012/04/Mathematica_1110.gif" width="26" height="19" />，在这个表达式中消失了。相应地，表达式多出两个<strong><font color="#ff0000">纯跳跃</font></strong>的项。 </p>
<hr />
<h1><font color="#0000ff">随机分析库中伊藤公式的完整实现</font></h1>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 假设《<a href="http://blog.chaoskey.com/2012/04/13/201204121400" target="_blank">随机分析库初实现(Mathematica应用)</a>》中的代码已经整理到<strong>StochasticAnalysis.m</strong>中，并且已经将该文件放置在Mathematica软件的合适目录下。为了继续下面的论述，需要先加载此<strong><font color="#ff0000">随机分析库</font></strong>的实现：</p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_12" src="http://blog.chaoskey.com/files/2012/04/Mathematica_1210.gif" width="151" height="16" /></p>
<h2><font color="#c0504d"><em>补充一些记号</em></font></h2>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_13" src="http://blog.chaoskey.com/files/2012/04/Mathematica_1310.gif" width="515" height="112" /></p>
<p>说明：用<img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_14" src="http://blog.chaoskey.com/files/2012/04/Mathematica_1410.gif" width="59" height="17" />代表<strong><font color="#ff0000">强度为λ的泊松过程</font></strong>，泊松过程不是鞅，但<strong><font color="#ff0000">补偿泊松过程</font></strong><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_15" src="http://blog.chaoskey.com/files/2012/04/Mathematica_153.gif" width="55" height="15" />是鞅。     <br /><em>Δ</em>代表严格意义上的<strong><font color="#ff0000">纯跳跃</font></strong>，也代表<strong><font color="#ff0000">纯跳过程的形式微分</font></strong>。</p>
<h2><font color="#c0504d"><em>扩充和上述记号相关的运算法则</em></font></h2>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_16" src="http://blog.chaoskey.com/files/2012/04/Mathematica_163.gif" width="438" height="515" /></p>
<p>&#160;&#160;&#160;&#160;&#160; <font color="#0000ff" size="5"><strong>说明</strong></font>：这些运算法则定义了如下这些关系     <br />1）<img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_17" src="http://blog.chaoskey.com/files/2012/04/Mathematica_173.gif" width="265" height="17" />     <br />2）<img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_18" src="http://blog.chaoskey.com/files/2012/04/Mathematica_183.gif" width="164" height="20" />     <br />3）a(b==c)→ a b==a c     <br />4)&#160; <img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_19" src="http://blog.chaoskey.com/files/2012/04/Mathematica_192.gif" width="26" height="17" /> <img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_20" src="http://blog.chaoskey.com/files/2012/04/Mathematica_202.gif" width="26" height="19" />=0,<em>i</em><em>≠</em><em>j</em>     <br />5）X dY==0     <br />6）<img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_21" src="http://blog.chaoskey.com/files/2012/04/Mathematica_214.gif" width="107" height="20" />     <br />7）<img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_22" src="http://blog.chaoskey.com/files/2012/04/Mathematica_222.gif" width="122" height="20" /></p>
<h2><font color="#c0504d"><em>含泊松跳跃的化简</em></font></h2>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_23" src="http://blog.chaoskey.com/files/2012/04/Mathematica_232.gif" width="765" height="237" /></p>
<p>&#160;&#160;&#160;&#160;&#160; <font color="#0000ff" size="5"><strong>说明</strong></font>：由于<strong><font color="#ff0000">泊松跳跃</font></strong><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_24" src="http://blog.chaoskey.com/files/2012/04/Mathematica_242.gif" width="46" height="20" />的<strong><font color="#ff0000">二值性</font></strong>：{0,1},故有关系: <img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_25" src="http://blog.chaoskey.com/files/2012/04/Mathematica_252.gif" width="234" height="20" />     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>PoissonSimplify</strong>功能就是利用这个关系进行化简。</p>
<h2><font color="#c0504d"><em>跳跃的计算</em></font></h2>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_26" src="http://blog.chaoskey.com/files/2012/04/Mathematica_262.gif" width="573" height="337" /></p>
<p>&#160;&#160;&#160;&#160;&#160; <font color="#0000ff" size="5"><strong>说明</strong></font>：上述规则就是将形如f[t,x[t],y[t],&#8230;]的表达式变换成f[t,x,y,...]，     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; 然后调用后面的规则计算[f[t,x,y,..],t]==φ[t,x,y,...]，     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; 最后再变回成φ[t,x[t],y[t],&#8230;]</p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_27" src="http://blog.chaoskey.com/files/2012/04/Mathematica_272.gif" width="291" height="37" /></p>
<p>&#160;&#160;&#160;&#160;&#160; <font color="#0000ff" size="5"><strong>说明</strong></font>：这两个规则表示 : J({X,Y,Z})=={J(X),J[Y],J[Z]}</p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_28" src="http://blog.chaoskey.com/files/2012/04/Mathematica_282.gif" width="279" height="37" /></p>
<p>&#160;&#160;&#160;&#160;&#160; <font color="#0000ff" size="5"><strong>说明</strong></font>：这两个规则是技术性规则 J[Y,t,X,Y,Z,...]==J[Y],J[t,t,X,Y,...]==0</p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_29" src="http://blog.chaoskey.com/files/2012/04/Mathematica_292.gif" width="762" height="57" /></p>
<p>&#160;&#160;&#160;&#160;&#160; <font color="#0000ff" size="5"><strong>说明</strong></font>：这个规则就是跳跃的最终实现:f(t,x,y)==f(t,x+J[x],y+J[y])-f(t,x,y)。</p>
<h2><font color="#c0504d"><em>伊藤公式的扩展</em></font></h2>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_30" src="http://blog.chaoskey.com/files/2012/04/Mathematica_302.gif" width="1489" height="57" /></p>
<p>&#160;&#160;&#160;&#160;&#160; <font color="#0000ff" size="5"><strong>说明</strong></font>：至此，已经完全实现了伊藤公式在半鞅下的实现。</p>
<h2><font color="#c0504d"><em>代码整合</em></font></h2>
<p>&#160;&#160;&#160; 最后需要将上述代码整合到到StochasticAnalysis.m中。 </p>
<hr />
<h1><font color="#0000ff"><font>应用</font></font></h1>
<h2><font color="#c0504d"><em>例一：含跳跃的随机链式法则</em></font></h2>
<p>&#160;&#160;&#160;&#160; <strong><font color="#ff0000">和不含跳跃的情形一致</font></strong></p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_31" src="http://blog.chaoskey.com/files/2012/04/Mathematica_314.gif" width="389" height="16" /></p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_32" src="http://blog.chaoskey.com/files/2012/04/Mathematica_322.gif" width="273" height="15" /></p>
<h2><font color="#c0504d"><em>例二：标准维纳过程平方的伊藤全微分</em></font></h2>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_33" src="http://blog.chaoskey.com/files/2012/04/Mathematica_332.gif" width="412" height="18" /></p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_34" src="http://blog.chaoskey.com/files/2012/04/Mathematica_342.gif" width="151" height="17" /></p>
<h2><font color="#c0504d"><em>例三：带漂移项的几何泊松过程</em></font></h2>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_35" src="http://blog.chaoskey.com/files/2012/04/Mathematica_352.gif" width="682" height="77" /></p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_36" src="http://blog.chaoskey.com/files/2012/04/Mathematica_362.gif" width="191" height="20" /></p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_37" src="http://blog.chaoskey.com/files/2012/04/Mathematica_372.gif" width="137" height="20" /></p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_38" src="http://blog.chaoskey.com/files/2012/04/Mathematica_382.gif" width="226" height="20" /></p>
<h2><font color="#c0504d"><em>例四：伊藤公式的一个常用形式</em></font></h2>
<p><strong><font color="#ff0000">&#160;&#160;&#160;&#160; 不含跳跃的情况</font></strong></p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_39" src="http://blog.chaoskey.com/files/2012/04/Mathematica_392.gif" width="561" height="77" /></p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_40" src="http://blog.chaoskey.com/files/2012/04/Mathematica_401.gif" width="153" height="15" /></p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_41" src="http://blog.chaoskey.com/files/2012/04/Mathematica_412.gif" width="56" height="15" /></p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_42" src="http://blog.chaoskey.com/files/2012/04/Mathematica_422.gif" width="530" height="33" /></p>
<p><strong><font color="#ff0000">&#160;&#160;&#160;&#160; 含跳跃的情况</font></strong></p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_43" src="http://blog.chaoskey.com/files/2012/04/Mathematica_432.gif" width="688" height="97" /></p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_44" src="http://blog.chaoskey.com/files/2012/04/Mathematica_441.gif" width="235" height="20" /></p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_45" src="http://blog.chaoskey.com/files/2012/04/Mathematica_451.gif" width="118" height="20" /></p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_46" src="http://blog.chaoskey.com/files/2012/04/Mathematica_461.gif" width="744" height="33" /></p>
<h2><font color="#c0504d"><em>例五：解含泊松跳跃随机微分方程</em></font></h2>
<p><strong><font color="#0000ff">待求解的随机微分方程</font></strong></p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_47" src="http://blog.chaoskey.com/files/2012/04/Mathematica_471.gif" width="706" height="16" /></p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_48" src="http://blog.chaoskey.com/files/2012/04/Mathematica_481.gif" width="258" height="20" /></p>
<p><strong><font color="#0000ff">对应的纯跳跃成分</font></strong></p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_49" src="http://blog.chaoskey.com/files/2012/04/Mathematica_491.gif" width="403" height="16" /></p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_50" src="http://blog.chaoskey.com/files/2012/04/Mathematica_501.gif" width="133" height="20" /></p>
<p><strong><font color="#0000ff">求log(S(t))的伊藤微分</font></strong></p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_51" src="http://blog.chaoskey.com/files/2012/04/Mathematica_512.gif" width="737" height="57" /></p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_52" src="http://blog.chaoskey.com/files/2012/04/Mathematica_522.gif" width="348" height="42" /></p>
<p><strong><font color="#0000ff">写成积分形式，就是原随机微分方程的显示解</font></strong>     <br /><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="含跳跃的随机分析(Mathematica应用)_53" src="http://blog.chaoskey.com/files/2012/04/Mathematica_531.gif" width="530" height="52" /> </p>
<hr />
<h1><font color="#0000ff">参考资料</font></h1>
<p>1）《金融随机分析(II)-连续时间模型(中文版)》-(美)S.E.Shreve，上海财经出版社</p>
<p>2）《半鞅与随机分析》，何声武,汪嘉冈,严加安，科学出版社</p>
<p>3）《随机金融基础(第2卷)-理论》，(俄)A.H.施利亚耶夫，-高等教育出版社</p>
<p>4）A Benchmark Approach to Quantitative Finance，Echhard.Platen，David.Heath，Springer</p>
<p><a href="http://www.wolfram.com/products/mathematica/"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="spikeyIcon" src="http://blog.chaoskey.com/files/2012/04/spikeyIcon2.png" width="20" height="21" /> Created with Wolfram Mathematica 8.0</a></p>
<p style='text-align:left'>&copy; 2012, <a href='http://blog.chaoskey.com'>無處不在</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chaoskey.com/2012/04/19/201204192245/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>鞅方法金融模型分析(Mathematica应用)</title>
		<link>http://blog.chaoskey.com/2012/04/15/201204152232</link>
		<comments>http://blog.chaoskey.com/2012/04/15/201204152232#comments</comments>
		<pubDate>Sun, 15 Apr 2012 14:51:42 +0000</pubDate>
		<dc:creator>混沌</dc:creator>
				<category><![CDATA[读书笔记]]></category>
		<category><![CDATA[mathematica]]></category>
		<category><![CDATA[Stochastic]]></category>
		<category><![CDATA[数学]]></category>
		<category><![CDATA[笔记]]></category>
		<category><![CDATA[金融模型]]></category>
		<category><![CDATA[随机分析]]></category>
		<category><![CDATA[鞅]]></category>

		<guid isPermaLink="false">http://blog.chaoskey.com/2012/04/15/201204152232</guid>
		<description><![CDATA[（*转载务必注明出处*） 在Mathematica中推演了两类鞅方法：一类是经典的等价鞅测度(风险中性世界)上的鞅方法，另一类就是真实概率测度（真实世界）上的鞅方法,也就是所谓的基准分析法。 等价鞅测度法是基于所谓的资产定价的第一与第二基本定理：粗略地说，即，市场无套利机会等价于存在等价鞅测度，使得所有证券的贴现价格()过程为鞅(第一定理)，并且当市场完全时，这样的鞅测度是唯一的(第二定理)。 基准分析法则是基于最优增长组合(GOP)的存在性，使得证券的基准化价格()过程在真实概率测度中为鞅。 最优增长组合(GOP)的存在性的条件，相对于等价鞅测度的存在性算是一个很宽松的条件。 所以基准分析法相对而言具有更大优势。 关于这两种鞅方法，我个人认为，优先采用等价鞅测度法，如果不存在等价鞅测度，则考虑基准分析法。 随机分析库 很遗憾，Mathematica并没有提供随机分析相关的符号运算库，为此本人实现一个Mathematica的随机分析库StochasticAnalysis。本着够用就行的原则，随着推演的深入而逐步丰富完善。 具体实现参见上一篇文章：《随机分析库初实现(Mathematica应用)》 Black-Scholes模型 基础证券价格过程S(t)随机微分方程(SSDE)： 无风险资产价格过程B(t)微分方程(BDE)： 等价鞅测度法 真实世界(真实概率测度)中,基础证券贴现SDE(SDiscSDE) 其中被称为基础风险证券贴现价格 寻找风险中性世界(等价鞅测度)中的标准维纳过程 资本定价基本定理告诉我们：市场无套利并且完全时，存在唯一的等价鞅测度。 为了能够使用等价鞅测度，我们不妨假设市场无套利并且完全。 我们用来表示鞅测度下标准维纳过程。依据伊藤积分的鞅性定理，如果满足如下方程，那么就是鞅。 比较方程SMDiscSDE和SDiscSDE，和W(t)有如下关系： &#160;&#160;&#160; 其中：被称为市场风险价格。 上述论述说明了：是鞅等价于是标准维纳过程。 于是问题归结为：寻找一个测度变换，变换后的是标准维纳过程。 Girsanov定理给出了肯定的回答：在测度变换 下，成为一个标准维纳过程。 这个定理同时构造了一个等价测度，由前面的分析知：是标准维纳过程，意味着在这个等价测度下构成鞅，进而这个等价测度就是唯一的等价鞅测度。 风险中性世界中,基础证券贴现SDE(SMDiscSDE) 既然在等价鞅测度下成为一个标准维纳过程，于是有： 风险中性世界中,基础证券SDE(SMSDE) SMSDE的求解： 此解对应的积分形式： 注意：W是风险中性世界中的标准维纳过程，正是这个原因才使得α(t)在这个方程中消失了。 当波动率σ(t)==σ为常数时,满足对数正态分布，可以直接用Mathematica中LogNormalDistribution表示: &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 其中：r在这里应该理解为，即某个时间段的平均利率。虽然它也不是常数，但对于特定的时间区间， 可以看成是常数.&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 波动率不能简单的这样处理，因为当波动率不为常数时，只能说明在很短的时间段内才是正态分布，就整体而言无法直接用正态分布表示,。 依据贴现价格的鞅性进行资产定价 由基础证券贴现价格在等价鞅测度下鞅性，很容易推导出基础证券的投资组合的贴现价格在等价鞅测度下也具有鞅性。根据市场的完全性假设，任何资产都可以用基础证券的投资组合来复制。资产的贴现价格也在等价鞅测度下具有鞅性。 所以资产的贴现价格在这个鞅测度下构成鞅，即： 将此鞅性变换成定价公式的形式: 当波动率为常数时，此定价公式可以简单表述为： 对应基础证券的分布： 基准分析法 投资组合 投资组合(PortsEq) 自融资组合(SelfPortsEq) 投资组合的SDE(PortSDE) &#160;&#160;&#160; 其中：,并且因为PortEq，故有关系π0(t)+π1(t)1。 最优增长组合（GOP）(GopSDE) 的SDE [...]]]></description>
			<content:encoded><![CDATA[<p>
<p>（*转载务必注明出处*）</p>
<p>在Mathematica中推演了两类鞅方法：一类是经典的<strong><font color="#ff0000">等价鞅测度(<font color="#000000">风险中性世界</font>)</font></strong>上的鞅方法，另一类就是<font color="#ff0000"><strong>真实概率测度（<font color="#000000">真实世界</font>）</strong></font>上的鞅方法,也就是所谓的<strong>基准分析法</strong>。</p>
<p><strong>等价鞅测度法</strong>是基于所谓的<strong><font color="#ff0000">资产定价的第一与第二基本定理</font></strong>：粗略地说，即，市场无套利机会等价于存在等价鞅测度，使得所有证券的贴现价格(<img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_1" src="http://blog.chaoskey.com/files/2012/04/Mathematica_112.gif" width="64" height="36" />)过程为鞅(第一定理)，并且当市场完全时，这样的鞅测度是唯一的(第二定理)。      <br /><strong>基准分析法</strong>则是基于<strong><font color="#ff0000">最优增长组合(GOP)</font></strong>的存在性，使得证券的基准化价格(<img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_2" src="http://blog.chaoskey.com/files/2012/04/Mathematica_211.gif" width="52" height="34" />)过程在真实概率测度中为鞅。      <br />最优增长组合(GOP)的存在性的条件，相对于等价鞅测度的存在性算是一个很宽松的条件。 所以基准分析法相对而言具有更大优势。</p>
<p>关于这两种鞅方法，我个人认为，优先采用等价鞅测度法，如果不存在等价鞅测度，则考虑基准分析法。</p>
</p>
<p><span id="more-1282983"></span><br />
<hr />
<h1><font color="#0000ff">随机分析库</font></h1>
<p>很遗憾，Mathematica并没有提供随机分析相关的符号运算库，为此本人实现一个Mathematica的随机分析库<strong>StochasticAnalysis</strong>。本着够用就行的原则，随着推演的深入而逐步丰富完善。      <br />具体实现参见上一篇文章：《<strong><a href="http://blog.chaoskey.com/2012/04/13/201204121400" target="_blank">随机分析库初实现(Mathematica应用)</a></strong>》</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_3" src="http://blog.chaoskey.com/files/2012/04/Mathematica_311.gif" width="151" height="16" /><br />
<hr /></p>
<h1><font color="#0000ff">Black-Scholes模型</font></h1>
<p><strong><font color="#ff0000">基础证券</font></strong>价格过程<em>S</em><em>(</em><em>t</em><em>)</em>随机微分方程(<font color="#ff0000">SSDE</font>)：</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_4" src="http://blog.chaoskey.com/files/2012/04/Mathematica_42.gif" width="552" height="16" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_5" src="http://blog.chaoskey.com/files/2012/04/Mathematica_52.gif" width="179" height="15" /></p>
<p><font color="#ff0000"><strong>无风险资产</strong></font>价格过程<em>B</em><em>(</em><em>t</em><em>)</em>微分方程(<font color="#ff0000">BDE</font>)：</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_6" src="http://blog.chaoskey.com/files/2012/04/Mathematica_62.gif" width="373" height="16" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_7" src="http://blog.chaoskey.com/files/2012/04/Mathematica_72.gif" width="100" height="15" /><br />
<hr /></p>
<h1><font color="#0000ff">等价鞅测度法</font></h1>
<h3><font color="#9b00d3"><em>真实世界(真实概率测度)中,基础证券贴现SDE(</em><font color="#ff0000"><font>SDiscSDE</font></font><em>)</em></font></h3>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_8" src="http://blog.chaoskey.com/files/2012/04/Mathematica_82.gif" width="499" height="76" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_9" src="http://blog.chaoskey.com/files/2012/04/Mathematica_92.gif" width="220" height="15" /></p>
<p> 其中<img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_10" src="http://blog.chaoskey.com/files/2012/04/Mathematica_102.gif" width="60" height="35" />被称为基础风险证券<strong><font color="#ff0000">贴现价格</font></strong></p>
<h3><font color="#9b00d3"><em>寻找风险中性世界(等价鞅测度)中的标准维纳过程</em></font></h3>
<p><strong>资本定价基本定理</strong>告诉我们：市场无套利并且完全时，存在唯一的等价鞅测度。 为了能够使用等价鞅测度，我们不妨假设市场无套利并且完全。       <br />我们用<img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_11" src="http://blog.chaoskey.com/files/2012/04/Mathematica_113.gif" width="27" height="16" />来表示鞅测度下标准维纳过程。依据<strong>伊藤积分的鞅性定理</strong>，如果<img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_12" src="http://blog.chaoskey.com/files/2012/04/Mathematica_122.gif" width="20" height="15" />满足如下方程，那么<img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_13" src="http://blog.chaoskey.com/files/2012/04/Mathematica_132.gif" width="20" height="15" />就是鞅。</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_14" src="http://blog.chaoskey.com/files/2012/04/Mathematica_142.gif" width="459" height="18" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_15" src="http://blog.chaoskey.com/files/2012/04/Mathematica_152.gif" width="124" height="15" /></p>
<p>比较方程SMDiscSDE和SDiscSDE，<img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_16" src="http://blog.chaoskey.com/files/2012/04/Mathematica_162.gif" width="27" height="16" />和<em>W</em><em>(</em><em>t</em><em>)</em>有如下关系：</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_17" src="http://blog.chaoskey.com/files/2012/04/Mathematica_172.gif" width="769" height="55" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_18" src="http://blog.chaoskey.com/files/2012/04/Mathematica_182.gif" width="130" height="15" /></p>
<p>&#160;&#160;&#160; 其中：<img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_19" src="http://blog.chaoskey.com/files/2012/04/Mathematica_191.gif" width="113" height="41" />被称为<strong><font color="#ff0000">市场风险价格</font></strong>。</p>
<p>上述论述说明了：<img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_20" src="http://blog.chaoskey.com/files/2012/04/Mathematica_201.gif" width="22" height="15" /><strong><font color="#ff0000">是鞅等价于</font></strong><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_21" src="http://blog.chaoskey.com/files/2012/04/Mathematica_212.gif" width="31" height="17" /><strong><font color="#ff0000">是标准维纳过程</font></strong>。      <br />于是问题归结为：寻找一个测度变换，变换后的<img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_22" src="http://blog.chaoskey.com/files/2012/04/Mathematica_221.gif" width="27" height="16" />是标准维纳过程。</p>
<p>Girsanov定理给出了肯定的回答：在测度变换</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_23" src="http://blog.chaoskey.com/files/2012/04/Mathematica_231.gif" width="202" height="57" /></p>
<p>下，<img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_24" src="http://blog.chaoskey.com/files/2012/04/Mathematica_241.gif" width="27" height="16" />成为一个标准维纳过程。      <br />这个定理同时构造了一个等价测度，由前面的分析知：<img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_25" src="http://blog.chaoskey.com/files/2012/04/Mathematica_251.gif" width="27" height="16" />是标准维纳过程，意味着<img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_26" src="http://blog.chaoskey.com/files/2012/04/Mathematica_261.gif" width="20" height="15" />在这个等价测度下构成鞅，进而这个等价测度就是唯一的等价鞅测度。</p>
<h3><font color="#9b00d3"><em>风险中性世界中,基础证券贴现SDE(</em><font color="#ff0000"><font>SMDiscSDE</font></font><em>)</em></font></h3>
<p>既然<img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_27" src="http://blog.chaoskey.com/files/2012/04/Mathematica_271.gif" width="27" height="16" />在等价鞅测度下成为一个标准维纳过程，于是有：</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_28" src="http://blog.chaoskey.com/files/2012/04/Mathematica_281.gif" width="442" height="18" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_29" src="http://blog.chaoskey.com/files/2012/04/Mathematica_291.gif" width="124" height="15" /></p>
<h3><font color="#9b00d3"><em>风险中性世界中,基础证券SDE(</em><font color="#ff0000">SMSDE</font><em>)</em></font></h3>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_30" src="http://blog.chaoskey.com/files/2012/04/Mathematica_301.gif" width="571" height="37" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_31" src="http://blog.chaoskey.com/files/2012/04/Mathematica_312.gif" width="177" height="15" /></p>
<p>SMSDE的求解：</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_32" src="http://blog.chaoskey.com/files/2012/04/Mathematica_321.gif" width="557" height="37" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_33" src="http://blog.chaoskey.com/files/2012/04/Mathematica_331.gif" width="225" height="42" /></p>
<p>此解对应的积分形式：     <br /><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_34" src="http://blog.chaoskey.com/files/2012/04/Mathematica_341.gif" width="393" height="41" />      <br />注意：W是风险中性世界中的标准维纳过程，正是这个原因才使得<em>α</em><em>(</em><em>t</em><em>)</em>在这个方程中消失了。</p>
<p>当波动率σ(t)==σ为常数时,<img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_35" src="http://blog.chaoskey.com/files/2012/04/Mathematica_351.gif" width="27" height="39" />满足<font color="#ff0000">对数正态分布</font>，可以直接用Mathematica中LogNormalDistribution表示:</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_36" src="http://blog.chaoskey.com/files/2012/04/Mathematica_361.gif" width="326" height="39" /></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 其中：<em>r</em>在这里应该理解为<img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_37" src="http://blog.chaoskey.com/files/2012/04/Mathematica_371.gif" width="92" height="45" />，即某个时间段的<font color="#ff0000">平均利率</font>。虽然它也不是常数，但对于特定的时间区间， 可以看成是常数.&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 波动率不能简单的这样处理，因为当波动率不为常数时，<img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_38" src="http://blog.chaoskey.com/files/2012/04/Mathematica_381.gif" width="96" height="39" />只能说明在很短的时间段内才是正态分布，就整体而言无法直接用正态分布表示,。</p>
<h3><font color="#9b00d3"><em>依据贴现价格的鞅性进行资产定价</em></font></h3>
<p>由基础证券贴现价格在等价鞅测度下鞅性，很容易推导出基础证券的投资组合的贴现价格在等价鞅测度下也具有鞅性。根据市场的完全性假设，任何资产都可以用基础证券的投资组合来复制。资产的贴现价格也在等价鞅测度下具有鞅性。</p>
<p>所以资产的贴现价格<img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_39" src="http://blog.chaoskey.com/files/2012/04/Mathematica_391.gif" width="22" height="15" />在这个鞅测度下构成鞅，即：</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_40" src="http://blog.chaoskey.com/files/2012/04/Mathematica_40.gif" width="135" height="23" /></p>
<p>将此鞅性变换成定价公式的形式:</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_41" src="http://blog.chaoskey.com/files/2012/04/Mathematica_411.gif" width="520" height="44" /></p>
<p>当波动率为常数时，此定价公式可以简单表述为：</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_42" src="http://blog.chaoskey.com/files/2012/04/Mathematica_421.gif" width="190" height="22" /></p>
<p>对应基础证券的分布：</p>
<p><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_43" src="http://blog.chaoskey.com/files/2012/04/Mathematica_43.gif" width="365" height="39" /><br />
<hr /></p>
<h1><font color="#0000ff">基准分析法</font></h1>
<h3><font color="#9b00d3"><em>投资组合</em></font></h3>
<p><strong>投资组合</strong><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_44" src="http://blog.chaoskey.com/files/2012/04/Mathematica_44.gif" width="33" height="19" />(<font color="#ff0000">PortsEq</font>)</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_45" src="http://blog.chaoskey.com/files/2012/04/Mathematica_45.gif" width="267" height="16" /></p>
<p><strong>自融资组合</strong>(<font color="#ff0000">SelfPortsEq</font>)</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_46" src="http://blog.chaoskey.com/files/2012/04/Mathematica_46.gif" width="580" height="16" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_47" src="http://blog.chaoskey.com/files/2012/04/Mathematica_47.gif" width="176" height="15" /></p>
<p><strong>投资组合</strong><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_48" src="http://blog.chaoskey.com/files/2012/04/Mathematica_48.gif" width="33" height="19" /><strong>的SDE</strong>(<font color="#ff0000">PortSDE</font>)</p>
<p><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_49" src="http://blog.chaoskey.com/files/2012/04/Mathematica_49.gif" width="609" height="57" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_50" src="http://blog.chaoskey.com/files/2012/04/Mathematica_50.gif" width="305" height="15" /></p>
<p>&#160;&#160;&#160; 其中：<img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_51" src="http://blog.chaoskey.com/files/2012/04/Mathematica_511.gif" width="242" height="41" />,并且因为<font color="#ff0000">PortEq</font>，故有关系π0(t)+π1(t)1。</p>
<h3><font color="#9b00d3"><font><em>最优增长组合（GOP）(</em><font color="#ff0000">GopSDE</font><em>)</em></font></font></h3>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_52" src="http://blog.chaoskey.com/files/2012/04/Mathematica_521.gif" width="62" height="19" />的SDE</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_53" src="http://blog.chaoskey.com/files/2012/04/Mathematica_53.gif" width="486" height="37" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_54" src="http://blog.chaoskey.com/files/2012/04/Mathematica_54.gif" width="382" height="33" /></p>
<p>设投资组合的增长率是<em>g</em><em>[</em><em>t</em><em>]</em>：</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_55" src="http://blog.chaoskey.com/files/2012/04/Mathematica_55.gif" width="600" height="16" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_56" src="http://blog.chaoskey.com/files/2012/04/Mathematica_56.gif" width="266" height="33" /></p>
<p>于是<font color="#ff0000">PortsSDE1</font>变成：</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_57" src="http://blog.chaoskey.com/files/2012/04/Mathematica_57.gif" width="440" height="16" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_58" src="http://blog.chaoskey.com/files/2012/04/Mathematica_58.gif" width="206" height="15" /></p>
<p><font color="#ff0000">所谓GOP过程，就是使<em>g</em><em>(</em><em>t</em><em>)</em>最大化的投资组合的价格过程。求<em>g</em><em>(</em><em>t</em><em>)</em>的极值点：</font></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_59" src="http://blog.chaoskey.com/files/2012/04/Mathematica_59.gif" width="386" height="16" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_60" src="http://blog.chaoskey.com/files/2012/04/Mathematica_60.gif" width="86" height="34" /></p>
<p>GOP SDE</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_61" src="http://blog.chaoskey.com/files/2012/04/Mathematica_611.gif" width="709" height="34" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_62" src="http://blog.chaoskey.com/files/2012/04/Mathematica_621.gif" width="242" height="19" /></p>
<h3><font color="#9b00d3"><em>基准化基础证券(</em><font color="#ff0000">SGopSDE</font><em>)</em></font></h3>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_63" src="http://blog.chaoskey.com/files/2012/04/Mathematica_63.gif" width="730" height="79" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_64" src="http://blog.chaoskey.com/files/2012/04/Mathematica_64.gif" width="161" height="18" /></p>
<p>&#160;&#160;&#160; 其中：<img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_65" src="http://blog.chaoskey.com/files/2012/04/Mathematica_65.gif" width="75" height="39" /></p>
<p>依据伊藤积分的鞅性定理知：<strong><font color="#ff0000">基准化基础证券在真实概率测度中构成鞅</font></strong>。</p>
<h3><font color="#9b00d3"><em>基准化无风险资产(</em><font color="#ff0000">BGopSDE</font><em>)</em></font></h3>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_66" src="http://blog.chaoskey.com/files/2012/04/Mathematica_66.gif" width="538" height="79" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_67" src="http://blog.chaoskey.com/files/2012/04/Mathematica_67.gif" width="137" height="18" /></p>
<p>&#160;&#160;&#160;&#160; 其中：<img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_68" src="http://blog.chaoskey.com/files/2012/04/Mathematica_68.gif" width="77" height="39" /></p>
<p>依据伊藤积分的鞅性定理知：<strong><font color="#ff0000">基准化无风险资产在真实概率测度中构成鞅</font></strong>。</p>
<h3><font color="#9b00d3"><em>基准化投资组合(</em><font color="#ff0000">PortsGopSDE</font><em>)</em></font></h3>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_69" src="http://blog.chaoskey.com/files/2012/04/Mathematica_69.gif" width="570" height="79" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_70" src="http://blog.chaoskey.com/files/2012/04/Mathematica_70.gif" width="201" height="18" /></p>
<p>&#160;&#160;&#160; 其中：<img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_71" src="http://blog.chaoskey.com/files/2012/04/Mathematica_711.gif" width="83" height="39" /></p>
<h3><font color="#9b00d3">投资组合的鞅性分析</font></h3>
<p>前面的分析告诉我们：<strong><font color="#ff0000">基础证券(包括有风险的，无风险的)的基准化价格在真实概率测度中构成鞅</font></strong>。</p>
<p>可以看出： 基础证券的<strong>这种鞅性是模型内生，GOP过程的存在性也是模型内生的</strong>，并不要求经典鞅方法的等价鞅测度。</p>
<p><strong><font color="#ff0000">基准化投资组合并不一定是鞅</font></strong>，原因是：<img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_72" src="http://blog.chaoskey.com/files/2012/04/Mathematica_721.gif" width="169" height="45" /> 并非是一个可料过程。</p>
<p>但是根据鞅论知识，还是能够获得基准化投资组合的一些性质：</p>
<p>１）首先，基准化投资组合<img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_73" src="http://blog.chaoskey.com/files/2012/04/Mathematica_73.gif" width="26" height="18" />是无漂移项的SDE，故<strong><font color="#ff0000">基准化投资组合在真实概率测度中至少是局部鞅</font></strong>。      <br />２）其次，由于任何非负的局部鞅都是一个上鞅，而由于公司法，破产法等相关的法律制度可以保证投资组合的非负性，故<strong><font color="#ff0000">基准化投资组合在真实概率测度中构成上鞅</font></strong>。      <br />３）最后，依据可选采样定理和基准化投资组合的上鞅性，可以推导出<strong><font color="#ff0000">任何非负的投资组合不允许套利的存在</font></strong>。</p>
<p>另外，虽然基准化的投资组合不一定是鞅，但不妨碍我们将基准化价格满足鞅性的投资组合价格的定义<strong><font color="#ff0000">公平价格</font></strong>。      <br />依据鞅论知识：最小的非负的上鞅是鞅。故<strong><font color="#ff0000">非负公平投资组合的价格是所有非负组合价格的最小值</font></strong>。</p>
<p>所以：在基准分析法中计算的资产价格都是特指公平价格，因为<strong><font color="#ff0000">公平价格的基准化在真实概率测度中构成鞅</font></strong>。即</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_74" src="http://blog.chaoskey.com/files/2012/04/Mathematica_74.gif" width="123" height="25" /></p>
<p>注意：上面的叙述是粗略的，并且依据概率论的惯例，应该都是在“几乎确定”的修饰下才成立的。</p>
<p><strong><em><font color="#9b00d3">利用基准分析法进行资产定价－计算公平价格</font></em></strong></p>
<p>将前面的鞅性直接转换成定价公式</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_75" src="http://blog.chaoskey.com/files/2012/04/Mathematica_75.gif" width="208" height="44" /></p>
<p>注意：基准分析法的定价公式具有一般性，和具体模型无关。只有在具体计算的时候才需要结合具体的模型。     <br /> 而等价鞅测度法，也和具体模型无关，但需要等价鞅测度的存在性作为基本假设。<br />
<hr /></p>
<h1><font color="#0000ff">定价函数偏微分方程的推导</font></h1>
<p>以贴现价格是鞅的情况为例，对贴现定价函数<img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_76" src="http://blog.chaoskey.com/files/2012/04/Mathematica_76.gif" width="75" height="15" />运用伊藤公式，然后代入风险中性世界证券过程<font color="#ff0000">SMSDE</font>和无风险资产过程<font color="#ff0000">BDE</font>,整理得：</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_77" src="http://blog.chaoskey.com/files/2012/04/Mathematica_77.gif" width="502" height="39" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_78" src="http://blog.chaoskey.com/files/2012/04/Mathematica_78.gif" width="816" height="33" /></p>
<p>由于<img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_79" src="http://blog.chaoskey.com/files/2012/04/Mathematica_79.gif" width="75" height="15" />是鞅，上述结果的<strong><font color="#ff0000">漂移项必须是零</font></strong>，于是获得<strong>贴现定价函数的偏微分方程</strong>(<font color="#ff0000">VDiscPDE</font>)：</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_80" src="http://blog.chaoskey.com/files/2012/04/Mathematica_80.gif" width="511" height="16" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_81" src="http://blog.chaoskey.com/files/2012/04/Mathematica_811.gif" width="616" height="33" /></p>
<p>进而得到<strong>定价函数的偏微分方程</strong>(<font color="#ff0000">VPDE</font>)：</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_82" src="http://blog.chaoskey.com/files/2012/04/Mathematica_821.gif" width="647" height="32" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_83" src="http://blog.chaoskey.com/files/2012/04/Mathematica_83.gif" width="435" height="33" /></p>
<p>另一方面，从“<strong>基准化价格是鞅</strong>”也能推导出同样的定价函数偏微分方程方程：(注意，代入的是真实世界的风险证券过程<font color="#ff0000">SSDE</font>和GOP过程<font color="#ff0000">GopSDE</font>)</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_84" src="http://blog.chaoskey.com/files/2012/04/Mathematica_84.gif" width="611" height="94" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_85" src="http://blog.chaoskey.com/files/2012/04/Mathematica_85.gif" width="435" height="33" /></p>
<p>注意： 我们发现这里的推导根本不需要Feynman-Kac公式，因为Feynman-Kac公式的具体细节都体现在各种规则中了。<br />
<hr /></p>
<h1><font color="#0000ff">常参数Black-Scholes模型的定价公式</font></h1>
<p>&#160;&#160;&#160; 就一般的金融模型而言，金融产品的定价函数往往没有显示解，需要依靠数值计算或蒙特卡洛模拟。 但对常参数Black-Scholes模型下的欧式期权是有显示解，下面通过三种方法推导出这个定价公式。</p>
<h3><font color="#9b00d3"><em>方法一：风险中性世界下的鞅定价</em></font></h3>
<p>&#160;&#160; 自然，我们必须选择风险中性世界下的SDE来描述基础证券的运动：</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_86" src="http://blog.chaoskey.com/files/2012/04/Mathematica_86.gif" width="169" height="16" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_87" src="http://blog.chaoskey.com/files/2012/04/Mathematica_87.gif" width="177" height="15" /></p>
<p>这表示（对常系数而言）：</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_88" src="http://blog.chaoskey.com/files/2012/04/Mathematica_88.gif" width="317" height="39" /></p>
<p>&#160;&#160;&#160; 其中： <img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_89" src="http://blog.chaoskey.com/files/2012/04/Mathematica_89.gif" width="14" height="15" />是基础证券的到期价格，<em>S</em>是基础证券的当前价格.</p>
<p>考虑一个<strong>看涨欧式期权</strong>的<font color="#ff0000">偿付函数</font>P(S,K):</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_90" src="http://blog.chaoskey.com/files/2012/04/Mathematica_90.gif" width="206" height="16" /></p>
<p>于是,依据鞅定价公式，直接计算看涨欧式期权定价公式的显式表达式(VCall)：</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_91" src="http://blog.chaoskey.com/files/2012/04/Mathematica_911.gif" width="905" height="39" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_92" src="http://blog.chaoskey.com/files/2012/04/Mathematica_921.gif" width="594" height="39" /></p>
<p>为了和教科书的公式一致，只要将Erf(x),Erfc(x)用标准正态分布函数<img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_93" src="http://blog.chaoskey.com/files/2012/04/Mathematica_93.gif" width="139" height="42" />表示：</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_94" src="http://blog.chaoskey.com/files/2012/04/Mathematica_94.gif" width="545" height="25" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_95" src="http://blog.chaoskey.com/files/2012/04/Mathematica_95.gif" width="511" height="38" /></p>
<h3><font color="#9b00d3"><em>方法二：真实世界下的鞅定价</em></font></h3>
<p>&#160;&#160; 这里，我们必须选择真实世界下的SDE和GOP过程来描述基础证券的运动，：</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_96" src="http://blog.chaoskey.com/files/2012/04/Mathematica_96.gif" width="495" height="16" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_97" src="http://blog.chaoskey.com/files/2012/04/Mathematica_97.gif" width="242" height="35" /></p>
<p>对于常数参数，其解为：</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_98" src="http://blog.chaoskey.com/files/2012/04/Mathematica_98.gif" width="257" height="114" /></p>
<p>考虑一个<strong>看涨欧式期权</strong>的<font color="#ff0000">偿付函数</font>P(S,K):</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_99" src="http://blog.chaoskey.com/files/2012/04/Mathematica_99.gif" width="206" height="16" /></p>
<p>于是,依据鞅定价公式，直接计算获得看涨欧式期权定价公式的显式表达式：</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_100" src="http://blog.chaoskey.com/files/2012/04/Mathematica_100.gif" width="935" height="94" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_101" src="http://blog.chaoskey.com/files/2012/04/Mathematica_1011.gif" width="511" height="38" /></p>
<p>&#160;&#160;&#160;&#160; 注意到：和前面方法一的结果一致，并且参数<em>θ</em>在结果中消失了。</p>
<h3><font color="#9b00d3"><em>方法三：解定价函数的偏微分方程</em></font></h3>
<h4><font color="#ccb400">Mathematica功能扩充</font></h4>
<p>为了让推演更加方便，首先扩充了 “<strong><font color="#ff0000">非等式表达式和等式表达式的乘积</font></strong>” 和 “<strong><font color="#ff0000">傅立叶变换/逆变换对泛函的支持</font></strong>”</p>
<p><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_102" src="http://blog.chaoskey.com/files/2012/04/Mathematica_1021.gif" width="1215" height="461" /></p>
<h4><font color="#ccb400">待求解的偏微分方程</font></h4>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_103" src="http://blog.chaoskey.com/files/2012/04/Mathematica_103.gif" width="293" height="37" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_104" src="http://blog.chaoskey.com/files/2012/04/Mathematica_104.gif" width="420" height="32" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_105" src="http://blog.chaoskey.com/files/2012/04/Mathematica_105.gif" width="94" height="15" /></p>
<h4><font color="#ccb400"><font>待定系数法将偏微分方程变换成最简形式</font></font></h4>
<p>考虑的含待定参数<em>γ</em>的<strong><font color="#ff0000">变量变换</font></strong>关系(<font color="#ff0000">varChange</font>):</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_106" src="http://blog.chaoskey.com/files/2012/04/Mathematica_106.gif" width="296" height="35" /></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong><font color="#0000ff">说明</font></strong>： 之所以出现了(T-t)，是因为需要将终值边界条件变换成初值边界条件。      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_107" src="http://blog.chaoskey.com/files/2012/04/Mathematica_107.gif" width="19" height="36" />的出现是为了将PDE的最简形式中消去<em>σ</em>参数。      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 第二个等式是为了，保证最终积分形式解的被积函数最简化，其中<em>γ</em>是一个待定参数.</p>
<p>考虑含待定参数{α,β}的<strong><font color="#ff0000">函数变换</font></strong>关系(<font color="#ff0000">funChange</font>):</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_108" src="http://blog.chaoskey.com/files/2012/04/Mathematica_108.gif" width="282" height="16" /></p>
<p>于是获得完整的函数变换形式(<font color="#ff0000">fullFunChange</font>)：</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_109" src="http://blog.chaoskey.com/files/2012/04/Mathematica_109.gif" width="451" height="16" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_110" src="http://blog.chaoskey.com/files/2012/04/Mathematica_1101.gif" width="515" height="33" /></p>
<p>进而获得完整<strong><font color="#ff0000">变换规则</font></strong>(<font color="#ff0000">rules</font>)：</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_111" src="http://blog.chaoskey.com/files/2012/04/Mathematica_1111.gif" width="921" height="16" /></p>
<p>利用变换规则对原PDE进行变换：</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_112" src="http://blog.chaoskey.com/files/2012/04/Mathematica_1121.gif" width="876" height="33" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_113" src="http://blog.chaoskey.com/files/2012/04/Mathematica_1131.gif" width="751" height="18" /></p>
<p>为了使方程最简单，只要前两项系数为零即可：</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_114" src="http://blog.chaoskey.com/files/2012/04/Mathematica_114.gif" width="508" height="16" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_115" src="http://blog.chaoskey.com/files/2012/04/Mathematica_115.gif" width="423" height="36" /></p>
<p>&#160;&#160;&#160; 于是得到最简单的偏微分方程（<strong><font color="#ff0000">热传导方程</font></strong>）：</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_116" src="http://blog.chaoskey.com/files/2012/04/Mathematica_116.gif" width="287" height="32" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_117" src="http://blog.chaoskey.com/files/2012/04/Mathematica_117.gif" width="182" height="15" /></p>
<p>前含待定系数的变换方程，变成了：</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_118" src="http://blog.chaoskey.com/files/2012/04/Mathematica_118.gif" width="326" height="16" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_119" src="http://blog.chaoskey.com/files/2012/04/Mathematica_119.gif" width="547" height="45" /></p>
<p>对于<em>T</em>时刻的函数变换规则：</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_120" src="http://blog.chaoskey.com/files/2012/04/Mathematica_120.gif" width="377" height="16" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_121" src="http://blog.chaoskey.com/files/2012/04/Mathematica_1211.gif" width="213" height="28" /></p>
<p>对于<em>T</em>时刻的变量变换规则：</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_122" src="http://blog.chaoskey.com/files/2012/04/Mathematica_1221.gif" width="345" height="16" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_123" src="http://blog.chaoskey.com/files/2012/04/Mathematica_123.gif" width="51" height="18" /></p>
<p>于是边界方程变成了</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_124" src="http://blog.chaoskey.com/files/2012/04/Mathematica_124.gif" width="372" height="37" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_125" src="http://blog.chaoskey.com/files/2012/04/Mathematica_125.gif" width="177" height="31" /></p>
<h4><font color="#ccb400">用傅立叶变换解变换后的偏微分方程（热传导方程）</font></h4>
<p>对含边界条件的热传导方程做傅里叶变换(只对变量<em>x</em>变换)：</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_126" src="http://blog.chaoskey.com/files/2012/04/Mathematica_126.gif" width="955" height="59" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_127" src="http://blog.chaoskey.com/files/2012/04/Mathematica_127.gif" width="196" height="55" /></p>
<p>&#160; 这是一个关于<em>τ</em>的微分方程的初值问题，很容易求解</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_128" src="http://blog.chaoskey.com/files/2012/04/Mathematica_128.gif" width="494" height="16" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_129" src="http://blog.chaoskey.com/files/2012/04/Mathematica_129.gif" width="240" height="45" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_130" src="http://blog.chaoskey.com/files/2012/04/Mathematica_130.gif" width="583" height="16" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_131" src="http://blog.chaoskey.com/files/2012/04/Mathematica_1311.gif" width="253" height="73" /></p>
<p>这里我们就要选择适当的<em>γ</em>，使得表达式最简单，关注的表达式部分</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_132" src="http://blog.chaoskey.com/files/2012/04/Mathematica_1321.gif" width="278" height="18" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_133" src="http://blog.chaoskey.com/files/2012/04/Mathematica_133.gif" width="174" height="36" /></p>
<p>很明显，当<em>ξ</em>的系数为零时，表达式最简单:</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_134" src="http://blog.chaoskey.com/files/2012/04/Mathematica_134.gif" width="262" height="16" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_135" src="http://blog.chaoskey.com/files/2012/04/Mathematica_135.gif" width="73" height="35" /></p>
<p>于是三个待定参数{α,β,γ}全部找出了:</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_136" src="http://blog.chaoskey.com/files/2012/04/Mathematica_136.gif" width="170" height="37" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_137" src="http://blog.chaoskey.com/files/2012/04/Mathematica_137.gif" width="193" height="35" /></p>
<p>于是解的形式可以变的更简单：</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_138" src="http://blog.chaoskey.com/files/2012/04/Mathematica_138.gif" width="190" height="16" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_139" src="http://blog.chaoskey.com/files/2012/04/Mathematica_139.gif" width="184" height="71" /></p>
<h4><font color="#ccb400">考虑欧式看涨期权</font></h4>
<p><strong>看涨欧式期权</strong>的<strong><font color="#ff0000">偿付函数</font></strong>P(S,K):</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_140" src="http://blog.chaoskey.com/files/2012/04/Mathematica_140.gif" width="206" height="16" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_141" src="http://blog.chaoskey.com/files/2012/04/Mathematica_1411.gif" width="392" height="16" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_142" src="http://blog.chaoskey.com/files/2012/04/Mathematica_1421.gif" width="451" height="37" /></p>
<h4><font color="#ccb400">变量恢复,得到原始目标偏微分方程的解</font></h4>
<p>根据αβγ确定 <strong>函数变换</strong>关系 和 <strong>变量变换</strong>关系：</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_143" src="http://blog.chaoskey.com/files/2012/04/Mathematica_143.gif" width="192" height="37" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_144" src="http://blog.chaoskey.com/files/2012/04/Mathematica_144.gif" width="283" height="36" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_145" src="http://blog.chaoskey.com/files/2012/04/Mathematica_145.gif" width="150" height="27" /></p>
<p>得到偏微分方程的解</p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_146" src="http://blog.chaoskey.com/files/2012/04/Mathematica_146.gif" width="842" height="16" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_147" src="http://blog.chaoskey.com/files/2012/04/Mathematica_147.gif" width="833" height="46" /></p>
<p>为了和前面两个方法比较，并且考虑当前期权价格<em>t</em><em>→</em><em>0</em></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_148" src="http://blog.chaoskey.com/files/2012/04/Mathematica_148.gif" width="665" height="25" /></p>
<p><img style="border-bottom: 0px;border-left: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="鞅方法金融模型分析(Mathematica应用)_149" src="http://blog.chaoskey.com/files/2012/04/Mathematica_149.gif" width="511" height="43" /></p>
<p>很明显，和方法一和方法二的结论一致。<br />
<hr /></p>
<h1><font color="#0000ff"><font>参考资料</font></font></h1>
<p>1）《金融随机分析(II)-连续时间模型(中文版)》-(美)S.E.Shreve，上海财经出版社</p>
<p>2）《期权、期货及其他衍生产品(中文版.第七版)》，(加)John.C.Hull，机械工业出版社</p>
<p>3）《随机金融基础(第2卷)-理论》，(俄)A.H.施利亚耶夫，-高等教育出版社</p>
<p>4）A Benchmark Approach to Quantitative Finance，Echhard.Platen，David.Heath，Springer</p>
<p>5）Arbitrage Theory in Continuous Time (Second Edition)，Tomas BJORK，Oxford University Press</p>
<p><a href="http://www.wolfram.com/products/mathematica/"><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="spikeyIcon[1]" src="http://blog.chaoskey.com/files/2012/04/spikeyIcon1.png" width="20" height="21" /> Created with Wolfram Mathematica 8.0</a></p>
</p>
<p style='text-align:left'>&copy; 2012, <a href='http://blog.chaoskey.com'>無處不在</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chaoskey.com/2012/04/15/201204152232/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>随机分析库初实现(Mathematica应用)</title>
		<link>http://blog.chaoskey.com/2012/04/13/201204121400</link>
		<comments>http://blog.chaoskey.com/2012/04/13/201204121400#comments</comments>
		<pubDate>Sat, 14 Apr 2012 02:10:03 +0000</pubDate>
		<dc:creator>混沌</dc:creator>
				<category><![CDATA[读书笔记]]></category>
		<category><![CDATA[mathematica]]></category>
		<category><![CDATA[数学]]></category>
		<category><![CDATA[笔记]]></category>
		<category><![CDATA[随机分析]]></category>

		<guid isPermaLink="false">http://blog.chaoskey.com/2012/04/13/201204121400-2</guid>
		<description><![CDATA[&#160;&#160;&#160; 使用Mathematica已经有一段时间了，发现其本质就是一个规则和模式匹配引擎：你通过模式匹配,正确定义了一个规则集合，用户加载了该程序包(规则集合)后，一旦发出一条指令，由模式匹配引擎自动查找最适合的规则链（在所有的已加载的规则集合中），然后返回结果。理论上，任何有确定性规则的领域，它的形式推演都可以在这个环境下实现。 &#160;&#160;&#160; 作为例子，本文给出了“ 随机分析” 领域下的一个初步实现。之所以选择“ 随机分析”，是因为Mathematica程序库中还没有相关的库，网络上也没有检索到相关库。 随机分析之伊藤公式 &#160;&#160;&#160; 这个初步实现，仅仅包含“ 随机分析”中非常重要的伊藤公式的实现。在半鞅下，伊藤公式的最一般形式如下（包含了跳跃部分）： 为了一般性，考虑一个d维半鞅：,以及一个d+1元二次连续可微函数, 那么随机过程f(t,X)也是半鞅，并且 上式是伊藤公式的积分形式，在形式推演中，采用其微分形式更为方便： 作为“随机分析库”的一个初步实现，暂时不考虑含跳跃过程的随机过程，并且考虑到d&#60;X,Y&#62;=dX dY的形式关系,于是有进一步简化的形式： 随机分析库的初步实现 首先，确定伊藤全微分ItoDt的函数参数，类似Dt: 参数定义： ItoDt[f,t] 给出以t为时间参数,表达式f中形如x[t]为随机过程，f的伊藤全微分. ItoDt[f,t,x] 给出以t为时间参数,x为随机过程参数，f的伊藤全微分. 给出以t为时间参数,为向量随机过程参数，f的伊藤全微分. 引入一些记号： &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 说明：用代表标准维纳过程，用D代表伊藤全微分. 扩充和上述记号相关的运算法则： 说明：这些运算法则定义了如下这些关系 1） 2） 3） 4） 最后，给出伊藤公式的实现： &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 说明：上述规则就是将形如f[t,x[t],y[t],&#8230;]的表达式变换成f[t,x,y,...]， &#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 然后调用后面的规则计算D[f[t,x,y,..],t]==φ[t,x,y,...]， &#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 最后再变回成φ[t,x[t],y[t],&#8230;] &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 说明：这两个规则表示&#160; D({X,Y,Z})=={DX,DY,DZ} &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 说明：这两个规则是技术性规则 D(Y,t,X,Y,Z,&#8230;)==DY,D(t,t,X,Y,&#8230;)==dt &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 说明：这个规则就是伊藤公式的最终实现。 应用 例一：随机链式法则 例二：标准维纳过程平方的伊藤全微分 例三： 例四：伊藤公式的一个常用形式 [...]]]></description>
			<content:encoded><![CDATA[<p>&#160;&#160;&#160; 使用Mathematica已经有一段时间了，发现其本质就是一个<strong><font color="#ff0000">规则和模式匹配引擎</font></strong>：你通过模式匹配,正确定义了一个<strong><font color="#ff0000">规则集合</font></strong>，用户加载了该程序包(规则集合)后，一旦发出一条指令，由模式匹配引擎自动查找最适合的<strong><font color="#ff0000">规则链</font></strong>（在所有的已加载的规则集合中），然后返回结果。<strong><font color="#0000ff">理论上，任何有确定性规则的领域，它的形式推演都可以在这个环境下实现</font></strong>。     <br />&#160;&#160;&#160; 作为例子，本文给出了“ <strong><font color="#ff0000">随机分析</font></strong>” 领域下的一个初步实现。之所以选择“ 随机分析”，是因为Mathematica程序库中还没有相关的库，网络上也没有检索到相关库。</p>
<p><span id="more-1282828"></span><br />
<hr />
<h1><strong>随机分析之伊藤公式</strong></h1>
<p>&#160;&#160;&#160; 这个初步实现，仅仅包含“ 随机分析”中非常重要的<strong><font color="#ff0000">伊藤公式</font></strong>的实现。在<strong><font color="#ff0000">半鞅</font></strong>下，伊藤公式的最一般形式如下（<strong><font color="#0000ff">包含了跳跃部分</font></strong>）：</p>
<p>为了一般性，考虑一个<em>d</em>维半鞅：<img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_1" src="http://blog.chaoskey.com/files/2012/04/Mathematica_1.gif" width="103" height="21" />,以及一个d+1元二次连续可微函数<img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_2" src="http://blog.chaoskey.com/files/2012/04/Mathematica_2.gif" width="92" height="19" />, 那么随机过程f(t,X)也是半鞅，并且     <br /><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_3" src="http://blog.chaoskey.com/files/2012/04/Mathematica_3.gif" width="665" height="103" /></p>
<p>上式是伊藤公式的积分形式，在形式推演中，采用其微分形式更为方便：    <br /><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_4" src="http://blog.chaoskey.com/files/2012/04/Mathematica_4.gif" width="618" height="103" /></p>
<p>作为“随机分析库”的一个初步实现，<strong><font color="#0000ff">暂时不考虑含跳跃过程</font></strong>的随机过程，并且考虑到d&lt;X,Y&gt;=dX dY的形式关系,于是有进一步简化的形式：</p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_5" src="http://blog.chaoskey.com/files/2012/04/Mathematica_5.gif" width="612" height="50" /> </p>
<hr />
<h1><font>随机分析库的初步实现</font></h1>
<h3><strong><em><font color="#0000ff">首先，确定伊藤全微分ItoDt的函数参数，类似Dt:</font></em></strong></h3>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_6" src="http://blog.chaoskey.com/files/2012/04/Mathematica_6.gif" width="26" height="16" /></p>
<p><a></a><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_7" src="http://blog.chaoskey.com/files/2012/04/Mathematica_7.gif" width="1178" height="93" /></p>
<p><strong><font color="#ff0000">参数定义</font></strong>：     <br />ItoDt[f,t] 给出以t为时间参数,表达式f中形如x[t]为随机过程，f的伊藤全微分.     <br />ItoDt[f,t,x] 给出以<em>t</em>为时间参数,x为随机过程参数，<em>f</em>的伊藤全微分.     <br /><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_8" src="http://blog.chaoskey.com/files/2012/04/Mathematica_8.gif" width="143" height="19" /> 给出以t为时间参数,<img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_9" src="http://blog.chaoskey.com/files/2012/04/Mathematica_9.gif" width="75" height="19" />为向量随机过程参数，f的伊藤全微分.</p>
<h3><font color="#0000ff"><em>引入一些记号：</em></font></h3>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_10" src="http://blog.chaoskey.com/files/2012/04/Mathematica_10.gif" width="484" height="109" /></p>
<p><strong><font color="#ff0000">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></strong><strong><font color="#ff0000">说明</font></strong>：用<img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_11" src="http://blog.chaoskey.com/files/2012/04/Mathematica_11.gif" width="59" height="15" />代表<strong><font color="#ff0000">标准维纳过程</font></strong>，用<em>D</em>代表<strong><font color="#ff0000">伊藤全微分</font></strong>.</p>
<h3><font color="#0000ff"><em>扩充和上述记号相关的运算法则：</em></font></h3>
<p><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_12" src="http://blog.chaoskey.com/files/2012/04/Mathematica_12.gif" width="604" height="277" /></p>
<blockquote><p><strong><font color="#ff0000">说明</font></strong>：这些运算法则定义了如下这些关系       <br />1）<img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_13" src="http://blog.chaoskey.com/files/2012/04/Mathematica_13.gif" width="260" height="15" />       <br />2）<img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_14" src="http://blog.chaoskey.com/files/2012/04/Mathematica_14.gif" width="266" height="17" />       <br />3）<img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_15" src="http://blog.chaoskey.com/files/2012/04/Mathematica_15.gif" width="133" height="18" />       <br />4）<img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_16" src="http://blog.chaoskey.com/files/2012/04/Mathematica_16.gif" width="167" height="17" /></p>
</blockquote>
<h3><font color="#0000ff"><em>最后，给出伊藤公式的实现：</em></font></h3>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_17" src="http://blog.chaoskey.com/files/2012/04/Mathematica_17.gif" width="573" height="337" /></p>
<p><strong><font color="#ff0000">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></strong><strong><font color="#ff0000">说明</font></strong>：上述规则就是将形如f[t,x[t],y[t],&#8230;]的表达式变换成f[t,x,y,...]，     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong><font color="#ff0000">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></strong>然后调用后面的规则计算D[f[t,x,y,..],t]==φ[t,x,y,...]，     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong><font color="#ff0000">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></strong>最后再变回成φ[t,x[t],y[t],&#8230;]</p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_18" src="http://blog.chaoskey.com/files/2012/04/Mathematica_18.gif" width="347" height="37" /></p>
<p><strong><font color="#ff0000">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></strong><strong><font color="#ff0000">说明</font></strong>：这两个规则表示&#160; D({X,Y,Z})=={DX,DY,DZ}</p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_19" src="http://blog.chaoskey.com/files/2012/04/Mathematica_19.gif" width="335" height="37" /></p>
<p><strong><font color="#ff0000">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></strong><strong><font color="#ff0000">说明</font></strong>：这两个规则是技术性规则 D(Y,t,X,Y,Z,&#8230;)==DY,D(t,t,X,Y,&#8230;)==dt</p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_20" src="http://blog.chaoskey.com/files/2012/04/Mathematica_20.gif" width="1014" height="57" /></p>
<p><strong><font color="#ff0000">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 说明</font></strong>：这个规则就是伊藤公式的最终实现。 </p>
<hr />
<h1><font>应用</font></h1>
<h3><font color="#0000ff"><em>例一：随机链式法则</em></font></h3>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_21" src="http://blog.chaoskey.com/files/2012/04/Mathematica_21.gif" width="389" height="16" /></p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_22" src="http://blog.chaoskey.com/files/2012/04/Mathematica_22.gif" width="273" height="15" /></p>
<h3><font color="#0000ff"><em>例二：标准维纳过程平方的伊藤全微分</em></font></h3>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_23" src="http://blog.chaoskey.com/files/2012/04/Mathematica_23.gif" width="412" height="18" /></p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_24" src="http://blog.chaoskey.com/files/2012/04/Mathematica_24.gif" width="151" height="17" /></p>
<h3><font color="#0000ff"><em>例三：</em></font></h3>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_25" src="http://blog.chaoskey.com/files/2012/04/Mathematica_25.gif" width="516" height="57" /></p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_26" src="http://blog.chaoskey.com/files/2012/04/Mathematica_26.gif" width="179" height="15" /></p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_27" src="http://blog.chaoskey.com/files/2012/04/Mathematica_27.gif" width="227" height="42" /></p>
<h3><em><font color="#0000ff"><font>例四：伊藤公式的一个常用形式</font></font></em></h3>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_28" src="http://blog.chaoskey.com/files/2012/04/Mathematica_28.gif" width="522" height="57" /></p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_29" src="http://blog.chaoskey.com/files/2012/04/Mathematica_29.gif" width="153" height="15" /></p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_30" src="http://blog.chaoskey.com/files/2012/04/Mathematica_30.gif" width="530" height="33" /></p>
<h3><font color="#0000ff"><em>例五：Black-Scholes模型</em></font></h3>
<h4><font color="#c0504d"><font>无风险资产</font><font>B</font><font>(</font><font>t</font><font>)</font><font>满足的微分方程（DE）：</font></font></h4>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_31" src="http://blog.chaoskey.com/files/2012/04/Mathematica_31.gif" width="323" height="16" /></p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_32" src="http://blog.chaoskey.com/files/2012/04/Mathematica_32.gif" width="100" height="15" /></p>
<p><strong><font color="#c0504d">风险资产S(t)满足的随机微分方程（SDE）:</font></strong></p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_33" src="http://blog.chaoskey.com/files/2012/04/Mathematica_33.gif" width="495" height="16" /></p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_34" src="http://blog.chaoskey.com/files/2012/04/Mathematica_34.gif" width="179" height="15" /></p>
<h4><font color="#c0504d"><font color="#c0504d">真实世界下，风险资产的贴现价格</font><em> </em></font><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_35" src="http://blog.chaoskey.com/files/2012/04/Mathematica_35.gif" width="53" height="28" />：</h4>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_36" src="http://blog.chaoskey.com/files/2012/04/Mathematica_36.gif" width="494" height="55" /></p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_37" src="http://blog.chaoskey.com/files/2012/04/Mathematica_37.gif" width="256" height="17" /></p>
<p><strong><em><font color="#c0504d">风险中性世界下的贴现价格</font></em></strong></p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_38" src="http://blog.chaoskey.com/files/2012/04/Mathematica_38.gif" width="614" height="34" /></p>
<p><img style="border-right-width: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="Mathematica程序包开发范例之随机分析_39" src="http://blog.chaoskey.com/files/2012/04/Mathematica_39.gif" width="124" height="15" /></p>
<p>依据伊藤积分的鞅性知： <strong><font color="#ff0000">在风险中性世界中，风险资产的贴现价格过程是鞅</font></strong>。 </p>
<hr />
<h1><font>后记</font></h1>
<p>本文涉及的“随机分析库”，可能会根据我的需要而修改添加，但此文作为程序包开发范例的初步实现，不会进行更新。    <br />下载：“<strong>随机分析库</strong>”初步实现的源代码： <strong>StochasticAnalysis.m</strong></p>
<p><a href="http://www.wolfram.com/products/mathematica/"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="spikeyIcon" src="http://blog.chaoskey.com/files/2012/04/spikeyIcon.png" width="20" height="21" /> Created with Wolfram Mathematica 8.0</a></p>
<p style='text-align:left'>&copy; 2012, <a href='http://blog.chaoskey.com'>無處不在</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chaoskey.com/2012/04/13/201204121400/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>如何方便地将数据随身携带？</title>
		<link>http://blog.chaoskey.com/2012/03/21/201203221500</link>
		<comments>http://blog.chaoskey.com/2012/03/21/201203221500#comments</comments>
		<pubDate>Thu, 22 Mar 2012 07:06:43 +0000</pubDate>
		<dc:creator>混沌</dc:creator>
				<category><![CDATA[无聊之处]]></category>
		<category><![CDATA[分享]]></category>
		<category><![CDATA[技巧]]></category>
		<category><![CDATA[数据同步]]></category>
		<category><![CDATA[绿色软件]]></category>
		<category><![CDATA[软件]]></category>

		<guid isPermaLink="false">http://blog.chaoskey.com/2012/03/21/201203221500</guid>
		<description><![CDATA[看到这个标题，你可能会说：“不就是复制到U盘或联网云存储嘛！” 如果真是那么简单，我就不需要写着篇文章了。 我的目标是： １）软件免安装（U盘携带）； ２）正常工作时，数据和软件全部在电脑上（不需要插入U盘）; ３）在其它环境中工作时（比如：网吧）中能够直接在U盘上处理; ４）能方便快捷地将数据转移到U盘，而不需要复制大量文件,也不需要仔细地选择需要复制的文件。 我的方案是： PortableApps.com ＋ Synkron PortableApps.com 是一款绿色软件的下载和管理软件，解决了软件的免安装问题。 Synkron 是一款文件夹同步程序，解决了电脑数据和U盘数据的同步问题。（当然如果你喜欢其他的文件夹同步程序也可） 这两款软件都支持中文界面，这两款程序本身也都是绿色软件。并且Synkron可以从PortableApps.com下载。 方案实施前提： 已经安装了PortableApps.com，并通过PortableApps.com下载好了所有我需要的绿色软件（自然也包括了Synkron）.并且将其他途径获的的绿色软件也放置在PortableApps.com中进行管理。日常经常用的文档也用PortableApps.com进行管理。 这样所有我需要携带的数据全部在PortableApps.com的安装目录中。 正常使用的场景： １）本地个人文档，我一般存储在PortableApps.com的Documents目录下。 ２）可能使用谷歌浏览器访问网络，离线或在线访问Gmai，并且可能会使用一些谷歌浏览器的扩展程序。 ３）可能使用火狐浏览器访问网络，并且可能会使用一些扩展程序。 ４）可能会使用FeedDemon离线或在线访问谷歌阅读器。 ５）可能会使用Windows Live Writer离线或在线写博文。 …… 关机前的数据同步： 所有上述行为涉及的软件都是绿色版，程序产生的数据都在各自的目录下，自然也都在PortableApps.com的安装目录下。 关电脑前，为了能在其它地方继续使用这些数据和软件，你必须将含有这些数据和软件的文件夹PortableApps复制到U盘上。 直接复制到U盘上？ 不，你想象一下这么多软件和数据总共估计有上G，偶尔这样大量复制一下没有问题，但要你天天复制这么多数据，你可能就烦了。 选择修改的部分复制到U盘上？ 不，简单几个文件还可以，如果要将所有变化的部分（可能包括程序生成的数据）仔细选择后复制到U盘上，估计你也不干了。 这时文件夹同步软件Synkron就派上用场了。第一次同步实际上就是整体复制到U盘上，可能要一段时间。但以后同步时只会复制/删除变化的部分(已删除的，新创建的，已修改的)。 注意：１）要同步已删除的可能需要一些设置 ２）为了保证同步的可靠性，必要保证任何要用到的机器时间基本准确。 其他环境下的使用场景（比如网吧）： 由于PortableApps.com本身也是绿色软件，只要你插入已正确同步了数据的U盘，找到其启动程序：PortableApps/Start.exe ，就可以通过PortableApps继续使用相关的程序和数据。由于是在U盘上直接运行，就不存在数据同步的问题。 回到家中或公司的正常环境下，插上U盘，启动同步程序将U盘中的数据同步到电脑中，然后拔掉U盘。又可以继续延续以前的工作环境和数据。 其实通过这种方式也可以将公司产生的数据和家中产生的数据进行同步， 很方便。 目前我通过PortableApps.com安装或管理的绿色软件列表： 从PortableApps直接下载的绿色软件 Synkron&#160;&#160;&#160;&#160;&#160;&#160;&#160; 文件夹同步程序 Toucan&#160;&#160;&#160;&#160;&#160;&#160;&#160; 又一款文件夹同步程序 Foxit Reader&#160;&#160;&#160; PDF阅读器 WinDjView&#160;&#160;&#160; Djvu阅读器 [...]]]></description>
			<content:encoded><![CDATA[<p>看到这个标题，你可能会说：“不就是复制到U盘或联网云存储嘛！” 如果真是那么简单，我就不需要写着篇文章了。</p>
<p><span id="more-1282756"></span>
</p>
<p> <!-- more -->
<p><strong><font color="#ff0000">我的目标是</font></strong>：</p>
<p>１）软件免安装（U盘携带）；</p>
<p>２）正常工作时，数据和软件全部在电脑上（不需要插入U盘）;</p>
<p>３）在其它环境中工作时（比如：网吧）中能够直接在U盘上处理; </p>
<p>４）能方便快捷地将数据转移到U盘，而不需要复制大量文件,也不需要仔细地选择需要复制的文件。</p>
<p><strong><font color="#ff0000">我的方案是</font></strong>： <strong><font color="#0000ff">PortableApps.com ＋ Synkron </font></strong></p>
<p>PortableApps.com 是一款绿色软件的下载和管理软件，解决了软件的免安装问题。</p>
<p>Synkron 是一款文件夹同步程序，解决了电脑数据和U盘数据的同步问题。（当然如果你喜欢其他的文件夹同步程序也可）</p>
<p>这两款软件都支持中文界面，这两款程序本身也都是绿色软件。并且Synkron可以从PortableApps.com下载。</p>
<p><strong><font color="#ff0000">方案实施前提</font></strong>：</p>
<p>已经安装了PortableApps.com，并通过PortableApps.com下载好了所有我需要的绿色软件（自然也包括了Synkron）.并且将其他途径获的的绿色软件也放置在PortableApps.com中进行管理。日常经常用的文档也用PortableApps.com进行管理。 这样所有我需要携带的数据全部在PortableApps.com的安装目录中。</p>
<p><strong><font color="#ff0000">正常使用的场景</font></strong>：</p>
<p>１）本地个人文档，我一般存储在PortableApps.com的Documents目录下。 </p>
<p>２）可能使用谷歌浏览器访问网络，离线或在线访问Gmai，并且可能会使用一些谷歌浏览器的扩展程序。 </p>
<p>３）可能使用火狐浏览器访问网络，并且可能会使用一些扩展程序。</p>
<p>４）可能会使用FeedDemon离线或在线访问谷歌阅读器。</p>
<p>５）可能会使用Windows Live Writer离线或在线写博文。</p>
<p>……</p>
<p><strong><font color="#ff0000">关机前的数据同步</font></strong>：</p>
<p>所有上述行为涉及的软件都是绿色版，程序产生的数据都在各自的目录下，自然也都在PortableApps.com的安装目录下。 </p>
<p>关电脑前，为了能在其它地方继续使用这些数据和软件，你必须将含有这些数据和软件的文件夹PortableApps复制到U盘上。 </p>
<p>直接复制到U盘上？ 不，你想象一下这么多软件和数据总共估计有上G，偶尔这样大量复制一下没有问题，但要你天天复制这么多数据，你可能就烦了。 </p>
<p>选择修改的部分复制到U盘上？ 不，简单几个文件还可以，如果要将所有变化的部分（可能包括程序生成的数据）仔细选择后复制到U盘上，估计你也不干了。</p>
<p>这时文件夹同步软件Synkron就派上用场了。第一次同步实际上就是整体复制到U盘上，可能要一段时间。但以后同步时只会复制/删除变化的部分(已删除的，新创建的，已修改的)。 </p>
<p>注意：１）要同步已删除的可能需要一些设置 ２）为了保证同步的可靠性，必要保证任何要用到的机器时间基本准确。</p>
<p><strong><font color="#ff0000">其他环境下的使用场景</font></strong>（比如网吧）：</p>
<p>由于PortableApps.com本身也是绿色软件，只要你插入已正确同步了数据的U盘，找到其启动程序：PortableApps/Start.exe ，就可以通过PortableApps继续使用相关的程序和数据。由于是在U盘上直接运行，就不存在数据同步的问题。</p>
<p>回到家中或公司的正常环境下，插上U盘，启动同步程序将U盘中的数据同步到电脑中，然后拔掉U盘。又可以继续延续以前的工作环境和数据。 其实通过这种方式也可以将公司产生的数据和家中产生的数据进行同步， 很方便。</p>
<p><strong><font color="#ff0000">目前我通过PortableApps.com安装或管理的绿色软件列表</font></strong>：</p>
<p><strong>从PortableApps直接下载的绿色软件</strong></p>
<p>Synkron&#160;&#160;&#160;&#160;&#160;&#160;&#160; 文件夹同步程序    <br />Toucan&#160;&#160;&#160;&#160;&#160;&#160;&#160; 又一款文件夹同步程序     <br />Foxit Reader&#160;&#160;&#160; PDF阅读器     <br />WinDjView&#160;&#160;&#160; Djvu阅读器     <br />FileZilla&#160;&#160;&#160; 文件传输客户端     <br />谷歌浏览器     <br />火狐浏览器     <br />Putty&#160;&#160;&#160;&#160;&#160;&#160;&#160; ssh客户端     <br />WinSCP&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sftp客户端     <br />7-Zip&#160;&#160;&#160;&#160;&#160;&#160;&#160; 解压缩软件     <br />Thunderbird&#160;&#160;&#160; 邮件客户端     <br />Command&#160;&#160;&#160;&#160;&#160;&#160;&#160; Win命令行 </p>
<p><strong>从其他途径获得的绿色软件</strong></p>
<p>Windows Live Writer&#160;&#160;&#160; 博客工具    <br />FeedDemon&#160;&#160;&#160;&#160;&#160;&#160;&#160; RSS离线阅读器(支持谷歌阅读器)     <br />无※界&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 翻墙软件     <br />自※由※门&#160;&#160;&#160;&#160;&#160;&#160;&#160; 翻墙软件&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />GaoAgent&#160;&#160;&#160;&#160;&#160;&#160;&#160; 翻墙软件</p>
<p><a href="http://blog.chaoskey.com/files/2012/03/PortableApps.jpg"><img style="border-right-width: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px" border="0" alt="PortableApps" src="http://blog.chaoskey.com/files/2012/03/PortableApps_thumb.jpg" width="305" height="429" /></a></p>
<p style='text-align:left'>&copy; 2012, <a href='http://blog.chaoskey.com'>無處不在</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chaoskey.com/2012/03/21/201203221500/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>mEngine使用方法－Mathematica的MathLink组件，负责调用Matlab</title>
		<link>http://blog.chaoskey.com/2012/03/15/201203161344</link>
		<comments>http://blog.chaoskey.com/2012/03/15/201203161344#comments</comments>
		<pubDate>Fri, 16 Mar 2012 06:58:47 +0000</pubDate>
		<dc:creator>混沌</dc:creator>
				<category><![CDATA[读书笔记]]></category>
		<category><![CDATA[mathematica]]></category>
		<category><![CDATA[matlab]]></category>
		<category><![CDATA[备忘]]></category>
		<category><![CDATA[数学软件]]></category>
		<category><![CDATA[笔记]]></category>

		<guid isPermaLink="false">http://blog.chaoskey.com/2012/03/15/201203161344</guid>
		<description><![CDATA[&#160;&#160;&#160; 本小文是根据mEngine(http://library.wolfram.com/infocenter/MathSource/4821/ )整理而成，系备忘性质。 使用前必须加载mEngine模块 一个Mathematica矩阵 将Mathematica矩阵x存储到Matlab的工作空间中。 注：第一次操作Matlab会先启动Matlab命令行（默认是隐藏状态） 查看Matlab工作空间的的x变量 在Mathematica中寻求Matlab命令帮助 对Matlab工作空间中的变量x求逆 将Matlab中的结果变量y转换成Mathematica的变量y 将Mathematica已存在的两个变量x,y存储到Matlab的工作空间中 在Matlab中求特征矩阵和特征向量 将Matlab的特征矩阵和特征向量变换成Mathematica的特征矩阵和特征向量 默认是隐藏了Matlab的命令行窗口，必要的话你可以通过下面的命令显示Matlab的命令行窗口，从而你可以直接在Matlab的这个命令行窗口内直接执行Matlab命令，并且同样可以在Mathematica中获取你的结果。 隐藏Matlab命令行窗口的命令: 一个稍微复杂的Mathematica与Matlab交互的例子 寻求帮助(注意：m开头的命令对于我们交互已经足够了) mEngine`eng eng=LinkObject[\&#34;D:\\Program\\Mathematica\\8.0\\AddOns\\Applications\\matlab\\mEngine.exe\&#34;,14,8] Created with Wolfram Mathematica 8.0 &#169; 2012, 無處不在. 版权所有.]]></description>
			<content:encoded><![CDATA[<p>&#160;&#160;&#160; 本小文是根据mEngine(<a href="http://library.wolfram.com/infocenter/MathSource/4821/" target="_blank">http://library.wolfram.com/infocenter/MathSource/4821/</a> )整理而成，系备忘性质。</p>
</p>
<p><span id="more-1282742"></span>
</p>
<p>使用前必须加载mEngine模块</p>
<p><a href="http://blog.chaoskey.com/files/2012/03/mEngine_1.gif"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="mEngine测试_1" src="http://blog.chaoskey.com/files/2012/03/mEngine_1_thumb.gif" width="75" height="16" /></a></p>
<p>一个Mathematica矩阵</p>
<p><a href="http://blog.chaoskey.com/files/2012/03/mEngine_2.gif"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="mEngine测试_2" src="http://blog.chaoskey.com/files/2012/03/mEngine_2_thumb.gif" width="130" height="56" /></a></p>
<p>将Mathematica矩阵<em>x</em>存储到Matlab的工作空间中。     <br />注：第一次操作Matlab会先启动Matlab命令行（默认是隐藏状态）</p>
<p><a href="http://blog.chaoskey.com/files/2012/03/mEngine_3.gif"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="mEngine测试_3" src="http://blog.chaoskey.com/files/2012/03/mEngine_3_thumb.gif" width="64" height="16" /></a></p>
<p><a href="http://blog.chaoskey.com/files/2012/03/mEngine_4.gif"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="mEngine测试_4" src="http://blog.chaoskey.com/files/2012/03/mEngine_4_thumb.gif" width="167" height="16" /></a></p>
<p><a href="http://blog.chaoskey.com/files/2012/03/mEngine_5.gif"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="mEngine测试_5" src="http://blog.chaoskey.com/files/2012/03/mEngine_5_thumb.gif" width="7" height="15" /></a></p>
<p>查看Matlab工作空间的的<em>x</em>变量</p>
<p><a href="http://blog.chaoskey.com/files/2012/03/mEngine_6.gif"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="mEngine测试_6" src="http://blog.chaoskey.com/files/2012/03/mEngine_6_thumb.gif" width="65" height="16" /></a></p>
<p><a href="http://blog.chaoskey.com/files/2012/03/mEngine_7.gif"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="mEngine测试_7" src="http://blog.chaoskey.com/files/2012/03/mEngine_7_thumb.gif" width="210" height="149" /></a></p>
<p>在Mathematica中寻求Matlab命令帮助</p>
<p><a href="http://blog.chaoskey.com/files/2012/03/mEngine_8.gif"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="mEngine测试_8" src="http://blog.chaoskey.com/files/2012/03/mEngine_8_thumb.gif" width="115" height="16" /></a></p>
<p><a href="http://blog.chaoskey.com/files/2012/03/mEngine_9.gif"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="mEngine测试_9" src="http://blog.chaoskey.com/files/2012/03/mEngine_9_thumb.gif" width="435" height="442" /></a></p>
<p>对Matlab工作空间中的变量<em>x</em>求逆</p>
<p><a href="http://blog.chaoskey.com/files/2012/03/mEngine_10.gif"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="mEngine测试_10" src="http://blog.chaoskey.com/files/2012/03/mEngine_10_thumb.gif" width="116" height="16" /></a></p>
<p><a href="http://blog.chaoskey.com/files/2012/03/mEngine_11.gif"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="mEngine测试_11" src="http://blog.chaoskey.com/files/2012/03/mEngine_11_thumb.gif" width="210" height="149" /></a></p>
<p>将Matlab中的结果变量<em>y</em>转换成Mathematica的变量<em>y</em></p>
<p><a href="http://blog.chaoskey.com/files/2012/03/mEngine_12.gif"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="mEngine测试_12" src="http://blog.chaoskey.com/files/2012/03/mEngine_12_thumb.gif" width="108" height="37" /></a></p>
<p><a href="http://blog.chaoskey.com/files/2012/03/mEngine_13.gif"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="mEngine测试_13" src="http://blog.chaoskey.com/files/2012/03/mEngine_13_thumb.gif" width="321" height="51" /></a></p>
<p>将Mathematica已存在的两个变量<em>x</em><em>,</em><em>y</em>存储到Matlab的工作空间中</p>
<p><a href="http://blog.chaoskey.com/files/2012/03/mEngine_14.gif"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="mEngine测试_14" src="http://blog.chaoskey.com/files/2012/03/mEngine_14_thumb.gif" width="111" height="16" /></a></p>
<p><a href="http://blog.chaoskey.com/files/2012/03/mEngine_15.gif"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="mEngine测试_15" src="http://blog.chaoskey.com/files/2012/03/mEngine_15_thumb.gif" width="39" height="15" /></a></p>
<p>在Matlab中求特征矩阵和特征向量</p>
<p><a href="http://blog.chaoskey.com/files/2012/03/mEngine_16.gif"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="mEngine测试_16" src="http://blog.chaoskey.com/files/2012/03/mEngine_16_thumb.gif" width="174" height="16" /></a></p>
<p><a href="http://blog.chaoskey.com/files/2012/03/mEngine_17.gif"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="mEngine测试_17" src="http://blog.chaoskey.com/files/2012/03/mEngine_17_thumb.gif" width="415" height="294" /></a></p>
<p>将Matlab的特征矩阵和特征向量变换成Mathematica的特征矩阵和特征向量</p>
<p><a href="http://blog.chaoskey.com/files/2012/03/mEngine_18.gif"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="mEngine测试_18" src="http://blog.chaoskey.com/files/2012/03/mEngine_18_thumb.gif" width="327" height="64" /></a></p>
<p><a href="http://blog.chaoskey.com/files/2012/03/mEngine_19.gif"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="mEngine测试_19" src="http://blog.chaoskey.com/files/2012/03/mEngine_19_thumb.gif" width="489" height="53" /></a></p>
<p><a href="http://blog.chaoskey.com/files/2012/03/mEngine_201.gif"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="mEngine测试_20" src="http://blog.chaoskey.com/files/2012/03/mEngine_20_thumb.gif" width="499" height="50" /></a></p>
<p>默认是隐藏了Matlab的命令行窗口，必要的话你可以通过下面的命令显示Matlab的命令行窗口，从而你可以直接在Matlab的这个命令行窗口内直接执行Matlab命令，并且同样可以在Mathematica中获取你的结果。</p>
<p><a href="http://blog.chaoskey.com/files/2012/03/mEngine_211.gif"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="mEngine测试_21" src="http://blog.chaoskey.com/files/2012/03/mEngine_21_thumb.gif" width="51" height="16" /></a></p>
<p>隐藏Matlab命令行窗口的命令:</p>
<p><a href="http://blog.chaoskey.com/files/2012/03/mEngine_22.gif"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="mEngine测试_22" src="http://blog.chaoskey.com/files/2012/03/mEngine_22_thumb.gif" width="50" height="16" /></a></p>
<p>一个稍微复杂的Mathematica与Matlab交互的例子</p>
<p><a href="http://blog.chaoskey.com/files/2012/03/mEngine_23.gif"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="mEngine测试_23" src="http://blog.chaoskey.com/files/2012/03/mEngine_23_thumb.gif" width="477" height="62" /></a></p>
<p><a href="http://blog.chaoskey.com/files/2012/03/mEngine_24.gif"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="mEngine测试_24" src="http://blog.chaoskey.com/files/2012/03/mEngine_24_thumb.gif" width="240" height="16" /></a></p>
<p><a href="http://blog.chaoskey.com/files/2012/03/mEngine_25.gif"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="mEngine测试_25" src="http://blog.chaoskey.com/files/2012/03/mEngine_25_thumb.gif" width="77" height="222" /></a></p>
<p>寻求帮助(注意：m开头的命令对于我们交互已经足够了)</p>
<p><a href="http://blog.chaoskey.com/files/2012/03/mEngine_26.gif"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="mEngine测试_26" src="http://blog.chaoskey.com/files/2012/03/mEngine_26_thumb.gif" width="73" height="16" /></a></p>
<p><a href="http://blog.chaoskey.com/files/2012/03/mEngine_272.gif"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="mEngine测试_27" src="http://blog.chaoskey.com/files/2012/03/mEngine_27_thumb1.gif" width="501" height="92" /></a></p>
<p><a href="http://blog.chaoskey.com/files/2012/03/mEngine_28.gif"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="mEngine测试_28" src="http://blog.chaoskey.com/files/2012/03/mEngine_28_thumb.gif" width="39" height="16" /></a></p>
<p><a></a><a href="http://blog.chaoskey.com/files/2012/03/mEngine_29.gif"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="mEngine测试_29" src="http://blog.chaoskey.com/files/2012/03/mEngine_29_thumb.gif" width="510" height="34" /></a></p>
<p><a href="http://blog.chaoskey.com/files/2012/03/mEngine_30.gif"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="mEngine测试_30" src="http://blog.chaoskey.com/files/2012/03/mEngine_30_thumb.gif" width="33" height="16" /></a></p>
<p>mEngine`eng</p>
<p>eng=LinkObject[\&quot;D:\\Program\\Mathematica\\8.0\\AddOns\\Applications\\matlab\\mEngine.exe\&quot;,14,8]</p>
<p><a href="http://www.wolfram.com/products/mathematica/"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="spikeyIcon" src="http://blog.chaoskey.com/files/2012/03/spikeyIcon.png" width="24" height="25" /> Created with Wolfram Mathematica 8.0</a></p>
<p style='text-align:left'>&copy; 2012, <a href='http://blog.chaoskey.com'>無處不在</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chaoskey.com/2012/03/15/201203161344/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Matlab,Maple和Mathematica三款主流科学计算软件的互操作</title>
		<link>http://blog.chaoskey.com/2012/03/15/201203152231</link>
		<comments>http://blog.chaoskey.com/2012/03/15/201203152231#comments</comments>
		<pubDate>Thu, 15 Mar 2012 14:33:51 +0000</pubDate>
		<dc:creator>混沌</dc:creator>
				<category><![CDATA[技术地带]]></category>
		<category><![CDATA[maple]]></category>
		<category><![CDATA[mathematica]]></category>
		<category><![CDATA[matlab]]></category>
		<category><![CDATA[备忘]]></category>
		<category><![CDATA[数学]]></category>
		<category><![CDATA[数学软件]]></category>

		<guid isPermaLink="false">http://blog.chaoskey.com/2012/03/15/201203152231</guid>
		<description><![CDATA[&#160;&#160;&#160;&#160;&#160;&#160;&#160; 本文根据网上零散的信息以及这三款软件自带的说明文档整理而成，为备忘而记录。记录了Matlab和Maple之间的相互调用，以及Matlab和Mathematica之间相互调用的安装配置方法。 为何需要互操作？ &#160;&#160;&#160;&#160;&#160;&#160;&#160; 数值计算和图形方面Matlab毫无疑问是最强的，但其符号演算方面就比较弱。 &#160;&#160;&#160;&#160;&#160;&#160;&#160; 符号运算方面Maple和Mathematica各有千秋。我个人感受：就符号运算本身而言，Mathematica应该比Maple更强，但软件自带工具包的丰富程度，Maple比Mathematica更丰富。此外，Mathematica本身的数值计算能力总体上还是比Maple更强，而Maple的易用性比Mathematica更强。 &#160;&#160;&#160;&#160;&#160;&#160;&#160; 由上面的优缺点对比，就存在可能会同时使用两款以上的软件，也就存在互操作问题。 本文成功配置的参考环境： &#160;&#160;&#160;&#160;&#160;&#160;&#160; Win7-x86+Matlab2011a+Mathematica8+Maple15+Microsoft Visual Studio 2010 一）在Matlab环境中调用Maple 1) 确认Matlab和Maple都已经安装。 2) 确认设置环境变量：MATLAB_SYMBOLIC=Maple 3) 安装Maple Toobox for Matlab 可以在Maple15安装目录下找到：MapleToolbox.bat 。 运行依向导运行之，并且依次按提示选择Maple和Matlab的安装目录。 4) 启动Matlab 并执行命令：toolbox_version，验证Maple工具箱是否安装成功 如果成功，该命令返回： toolbox_version=maple 5) 确保Matlab真的会使用Maple符号计算引擎 在Matlab命令行中输入: pathtool , 执行之会弹出一个对话框，下拉到最后，选中最后两个，然后点击左边的”Move to Top“（移动到顶端）按钮，然后选择保存。exit退出matlab，现在设置好了。 6) 重启Matlab,验证之： &#160;&#160;&#160;&#160;&#160;&#160;&#160; maple(&#8216;discrim(a*x^2+b*x+c,x)&#8217;) &#160;&#160;&#160;&#160;&#160;&#160;&#160; int(&#8216;atan(x)/x^(3/2)&#8217;,0,1) &#160;&#160;&#160;&#160;&#160;&#160;&#160; syms x &#160;&#160;&#160;&#160;&#160;&#160;&#160; maple(&#8216;solve(x^2*exp(x)-10,x)&#8217;) &#160;&#160;&#160;&#160;&#160;&#160;&#160; maple(&#8216;plot(exp(x)*x^2-1, x [...]]]></description>
			<content:encoded><![CDATA[<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 本文根据网上零散的信息以及这三款软件自带的说明文档整理而成，为备忘而记录。记录了Matlab和Maple之间的相互调用，以及Matlab和Mathematica之间相互调用的安装配置方法。</p>
<p><span id="more-1282671"></span>
<p><strong><font color="#0000ff">为何需要互操作？        <br /></font></strong>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 数值计算和图形方面Matlab毫无疑问是最强的，但其符号演算方面就比较弱。     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; 符号运算方面Maple和Mathematica各有千秋。我个人感受：就符号运算本身而言，Mathematica应该比Maple更强，但软件自带工具包的丰富程度，Maple比Mathematica更丰富。此外，Mathematica本身的数值计算能力总体上还是比Maple更强，而Maple的易用性比Mathematica更强。     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; 由上面的优缺点对比，就存在可能会同时使用两款以上的软件，也就存在互操作问题。 </p>
<p><strong><font color="#0000ff">本文成功配置的参考环境：        <br /></font></strong>&#160;&#160;&#160;&#160;&#160;&#160;&#160; Win7-x86+Matlab2011a+Mathematica8+Maple15+Microsoft Visual Studio 2010</p>
<p><font color="#ff0000"><strong>一）在Matlab环境中调用Maple</strong></font></p>
<ul>
<li><font color="#0000ff"><strong>1)</strong> </font>确认Matlab和Maple都已经安装。 </li>
<li><strong><font color="#0000ff">2)</font></strong> 确认<strong>设置环境变量</strong>：MATLAB_SYMBOLIC=Maple </li>
<li><strong><font color="#0000ff">3)</font></strong> <strong>安装Maple Toobox for Matlab        <br /></strong>可以在Maple15安装目录下找到：MapleToolbox.bat 。 运行依向导运行之，并且依次按提示选择Maple和Matlab的安装目录。 </li>
<li><strong><font color="#0000ff">4) </font></strong>启动Matlab 并执行命令：toolbox_version，验证Maple工具箱是否安装成功       <br />如果成功，该命令返回： toolbox_version=maple </li>
<li><strong><font color="#0000ff">5) </font></strong>确保Matlab真的会使用Maple符号计算引擎       <br />在Matlab命令行中输入: pathtool , 执行之会弹出一个对话框，下拉到最后，选中最后两个，然后点击左边的”Move to Top“（移动到顶端）按钮，然后选择保存。exit退出matlab，现在设置好了。 </li>
<li><strong><font color="#0000ff">6) </font></strong>重启Matlab,验证之： </li>
</ul>
<blockquote><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; maple(&#8216;discrim(a*x^2+b*x+c,x)&#8217;)      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; int(&#8216;atan(x)/x^(3/2)&#8217;,0,1)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; syms x       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; maple(&#8216;solve(x^2*exp(x)-10,x)&#8217;)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; maple(&#8216;plot(exp(x)*x^2-1, x = -5 .. .5)&#8217;)</p>
</blockquote>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 如果能正确地返回结果，则表明安装配置成功.</p>
<p><strong><font color="#ff0000">二）在Maple环境中调用Matlab&#160;&#160;&#160; </font></strong></p>
<ul>
<li><strong><font color="#0000ff">1) </font></strong>确认Matlab和Maple都已经安装。 </li>
<li><strong><font color="#0000ff">2) </font></strong>确认已将%MATLAB%\bin;%MATLAB%\bin\win32添加到PATH的环境变量中，其中%MATLAB%就是Matlab的安装路径。 </li>
<li><strong><font color="#0000ff">3) </font></strong>重新启动Maple,执行如下代码看是否正常<br />
<blockquote>
<p>Matlab[setvar](&quot;x&quot;,3.14);          <br />Matlab[getvar](&quot;x&quot;);</p>
</blockquote>
</li>
</ul>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 如果能正确地返回结果，则表明安装配置成功.&#160; </p>
<p>&#160;&#160; 另：我们可以注意到，随着这个的代码的执行，会自动打开一个Matlab命令行窗口。    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; 如果你愿意的话，可以在这个窗口中输入：x 。查看其结果，看看是否和Maple中的结果一致。     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; 你可以手工启动这个Matlab命令行窗口：&#160;&#160; Matlab[openlink]();     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; 你可以通过Matlab[closelink](); 来关闭这个Matlab命令窗口。</p>
<p><strong><font color="#ff0000">三）在Matlab中调用Mathematica</font></strong></p>
<ul>
<li><strong><font color="#0000ff">1) </font></strong>确认Matlab和Mathematica都已经安装，并且为了编译源代码还要求安装Microsoft Visual Studio </li>
<li><strong><font color="#0000ff">2) </font></strong>确认已将Mathematica的安装目录添加到PATH的环境变量中。 </li>
<li><strong><font color="#0000ff">3) </font>下载Mathematica Symbolic Toolbox for MATLAB &#8211; Version 2.0         <br /></strong>&#160;&#160;&#160;&#160;&#160;&#160; <a href="http://library.wolfram.com/infocenter/MathSource/5344/" target="_blank">http://library.wolfram.com/infocenter/MathSource/5344/</a>       <br />&#160;&#160;&#160; 并将其中的math.zip\mathematica_for_matlab\math_windows.zip\的文件解包到%MATLAB%\toolbox\mathematica目录下,并且删除其中math.dll（因为这个文件太老，可能不适用于当前版本） </li>
<li><strong><font color="#0000ff">4) </font></strong>确定Mathematica中<strong>mathlink.h</strong>所在的目录,以及<strong>ml32i1m.lib</strong>所在的目录,比如，对我的系统而言在：       <br />D:\Program\Mathematica\8.0\SystemFiles\Links\MathLink\DeveloperKit\Windows\CompilerAdditions\mldev32\include       <br />D:\Program\Mathematica\8.0\SystemFiles\Links\MathLink\DeveloperKit\Windows\CompilerAdditions\mldev32\lib       <br />&#160;&#160; 将这两个文件复制到%MATLAB%\toolbox\mathematica中 .       <br />&#160;&#160; 修改<strong>mathrun.m</strong>，将C:\XXX 替换为%MATLAB%\toolbox\mathematica的全路径目录 </li>
<li><strong><font color="#0000ff">5) </font></strong>确认<strong>Microsoft Visual Studio作为默认编译器</strong>:       <br />&#160;&#160;&#160;&#160; 打开Matlab命令行,执行<strong>mex –setup</strong> 选择Microsoft Visual Studio作为默认编译器。(建议设置好后退出Matlab) </li>
<li><strong><font color="#0000ff">6) </font></strong>再次打开Matlab命令行，将当前目录切换到%MATLAB%\toolbox\mathematica, 然后<strong>运行mathrun.m</strong>&#160;&#160; ,这个程序将会<strong>编译math.c</strong>       <br />&#160;&#160;&#160;&#160; 如果编译成功，确认%MATLAB%\toolbox\mathematica 已被添加到Matlab的Path路径中。&#160; <br />&#160;&#160;&#160;&#160; 最后运行在Matlab环境下<strong>运行测试代码</strong>: testscript.m 确认是否配置成功. </li>
</ul>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 另：<strong>使用方法</strong>直接可参见testscript.m的代码.</p>
<p><strong><font color="#ff0000">四）在Mathematica中调用Matlab </font></strong></p>
<ul>
<li><strong><font color="#0000ff">1) </font></strong>确认Matlab和Mathematica都已经安装，并且为了编译源代码还要求安装Microsoft Visual Studio </li>
<li><strong><font color="#0000ff">2) </font>下载 mEngine</strong>       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <a href="http://library.wolfram.com/infocenter/MathSource/4821/" target="_blank">http://library.wolfram.com/infocenter/MathSource/4821/</a>       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; 将压缩包mEngine.zip\mEngine\mEngineSource中的的文件复制到 D:\Program\Mathematica\8.0\AddOns\Applications\matlab&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; 将压缩包mEngine.zip\mEngine中的的文件mEngine.m和mEngine.nb也复制到 D:\Program\Mathematica\8.0\AddOns\Applications\matlab </li>
<li><strong><font color="#0000ff">3) </font></strong>确认已将%MATLAB%\bin;%MATLAB%\bin\win32添加到PATH的环境变量中，其中%MATLAB%就是Matlab的安装路径。 </li>
<li><strong><font color="#0000ff">4) </font></strong>打开Microsoft Visual Studio命令行环境，切换目录 </li>
</ul>
<blockquote><p>cd D:\Program\Mathematica\8.0\AddOns\Applications\matlab </p>
</blockquote>
<ul>
<li><strong><font color="#0000ff">5) </font></strong>在Microsoft Visual Studio命令行环境中，<strong>设置临时的编译环境</strong>(包括MathLink开发环境和Matlab开发环境) </li>
</ul>
<blockquote><p>SET MATHLINK=D:\Program\Mathematica\8.0\SystemFiles\Links\MathLink\DeveloperKit\Windows\CompilerAdditions\mldev32      <br />SET MATENGINE=D:\Program\MATLAB\R2011a\extern       <br />SET PATH=%PATH%;%MATHLINK%\bin\       <br />SET INCLUDE=%INCLUDE%;%MATHLINK%\include\;%MATENGINE%\include\       <br />SET LIB=%LIB%;%MATHLINK%\lib\;%MATENGINE%\lib\win32\microsoft </p>
</blockquote>
<ul>
<li><strong><font color="#0000ff">6) </font></strong>在Microsoft Visual Studio命令行环境中，<strong>设置编译参数</strong> </li>
</ul>
<blockquote><p>SET CL=/nologo /c /DWIN32 /D_WINDOWS /W3 /O2 /DNDEBUG      <br />SET LINK=/NOLOGO /SUBSYSTEM:windows /INCREMENTAL:no /PDB:NONE kernel32.lib user32.lib gdi32.lib </p>
</blockquote>
<ul>
<li><strong><font color="#0000ff">7) </font></strong>在Microsoft Visual Studio命令行环境中， <strong>编译生成mEngine.exe </strong></li>
</ul>
<blockquote><p>MPREP template.tm -o templatetm.c      <br />CL *.c       <br />LINK *.obj ml32i3m.lib&#160; libeng.lib libmx.lib /OUT:mEngine.exe </p>
</blockquote>
<ul>
<li><strong><font color="#0000ff"> <img src='http://blog.chaoskey.com/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> </font></strong>设置mEngine的Mathematica的搜索路径：       <br />在Mathematica中查看<strong>$BaseDirectory</strong>的值。（我系统中其值为 C:\ProgramData\Mathematica）       <br />然后在$BaseDirectory\Kernel\init.m中添加一行代码, 保存，重启Mathematica . </li>
</ul>
<blockquote><p>AppendTo[$Path,ToFileName[{$InstallationDirectory,&quot;AddOns&quot;,&quot;Applications&quot;,&quot;matlab&quot;}]] </p>
</blockquote>
<ul>
<li><strong><font color="#0000ff">9) </font></strong>参考mEngine.nb学习其用法且验证安装是否成功. </li>
</ul>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 另：使用前的加载方法:&#160; <strong>&lt;&lt; mEngine`</strong></p>
<p style='text-align:left'>&copy; 2012, <a href='http://blog.chaoskey.com'>無處不在</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chaoskey.com/2012/03/15/201203152231/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>HTTP代理之安全免费方案</title>
		<link>http://blog.chaoskey.com/2012/02/21/201202212226</link>
		<comments>http://blog.chaoskey.com/2012/02/21/201202212226#comments</comments>
		<pubDate>Tue, 21 Feb 2012 14:40:58 +0000</pubDate>
		<dc:creator>混沌</dc:creator>
				<category><![CDATA[技术地带]]></category>
		<category><![CDATA[appengine]]></category>
		<category><![CDATA[gae]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[HTTP代理]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.chaoskey.com/2012/02/21/201202212226</guid>
		<description><![CDATA[　　由于众所周知的原因，在中国“翻墙”是网民的必杀技。就翻墙而言，有各种各样的方案，大部分方案未必是安全的方案，而安全的方案未必是免费的。就算有即安全又免费的方案(比如：“自×由×门”，“无×界”)，由于其广泛利用，必然会遭到定点封锁，从而导致其不可靠。　 　　就普通的HTTP代理方案而言，无论是HTTP代理还是HTTPS代理(加密的)，其实都不是安全的方案。因为HTTPS的加密仅仅是对传输的内容进行加密，而代理访问的目标网址的传输暴露在外面。仅仅对目标网址进行判断就可以使之“撞墙”。非加密HTTP代理就更不安全了。　　 　　为此需要对HTTP代理方式进行改造来保证其安全性，首先在“墙内”的本地电脑中设置一个本地HTTP代理客户端，在&#8221;墙外&#8221;电脑中设置远程HTTP代理服务端 。 　　其次，“本地HTTP代理”和“远程HTTP代理”之间交换的数据采用“准加密的压缩包”方式进行传输。“准加密的压缩包”指的是：将包括网址，内容等相关HTTP数据打包压缩后，然后对压缩包头16个字节进行3DES加密。由于是压缩包的部分加密，故我称之为“准加密压缩包”。之所以采用“准加密”的方式是出于性能的考虑。　我认为（不知是否正确？）：头16个字节进行3DES加密的压缩包是无法破解的。这样就解决了由于网址暴露而导致的不完全性。 　　其实，上述方案(我称之为“客户端式HTTP代理”)就是“自×由×门”，“无×界”采用的方案，但由于“自×由×门／“无×界”的通用性而导致其不可靠性（会被定点封锁）。 　　于是我认为，越是个性化的翻墙方式越不可能会被定点封锁。goagent这款代理是一个很好切入点，其远程HTTP代理服务端(fetch.py)搭建在GoogleAppEngine上（免费的），本地HTTP代理就是一个python程序:proxy.py.&#160; http://code.google.com/p/goagent/ https://github.com/phus/goagent 　　我们可以对goagent这款客户端式代理进行改造，获得一个个性化安全的翻墙工具。（注：goagent交换的数据压缩包没有加密，也就不是完全安全的）。考虑到我的翻墙安全，我就不把改造后的程序公布了。仅仅介绍一下我对goagent做了哪些改造。 １）远程HTTP代理服务端：　用Google　Go语言重新开发了，部署在GAE上，然后绑定到一个特定域名上。 ２）本地和远程代理间的数据交换：采用了前述的“准加密压缩包”的形式进行传输。 ３）本地HTTP代理服务端：　本想用Google　Go语言重新开发，但目前Go开发的程序还不能运行在Window操作系统下，故还是使用proxy.py。但是删除了大量代码，专注于通过远程GAE的代理。 ４）保留了本地HTTPS劫持功能：在本地HTTP代理中自动伪造HTTPS证书，将用户的HTTPS请求进行劫持解密，然后按HTTP数据的“准加密压缩包”的方式传输。 ５）将proxy.py原本单线程的运行模式改造成多线程的运行模式。 　　最后，你们可能会失望了，我并没有给你提供了一个拿来即用的程序，仅仅是给你一个方法。这是因为如果具体程序一旦扩散开来，最终会遇到被定点封锁的命运。GAE已经被拦在“墙外”，本人是通过特殊方式绕过了拦截，一旦扩散开来会影响到我的使用。基于我的私心，就不公布具体程序：） &#169; 2012, 無處不在. 版权所有.]]></description>
			<content:encoded><![CDATA[<p>　　由于众所周知的原因，在中国“翻墙”是网民的必杀技。就翻墙而言，有各种各样的方案，大部分方案未必是安全的方案，而安全的方案未必是免费的。就算有即安全又免费的方案(比如：“自×由×门”，“无×界”)，由于其广泛利用，必然会遭到定点封锁，从而导致其不可靠。　</p>
<p><span id="more-1282661"></span>
<p>　　就普通的HTTP代理方案而言，无论是HTTP代理还是HTTPS代理(加密的)，其实都不是安全的方案。因为HTTPS的加密仅仅是对传输的内容进行加密，而代理访问的目标网址的传输暴露在外面。仅仅对目标网址进行判断就可以使之“撞墙”。非加密HTTP代理就更不安全了。　　</p>
<p>　　为此需要对HTTP代理方式进行改造来保证其安全性，首先在“墙内”的本地电脑中设置一个本地HTTP代理客户端，在&#8221;墙外&#8221;电脑中设置远程HTTP代理服务端 。</p>
<p>　　其次，“本地HTTP代理”和“远程HTTP代理”之间交换的数据采用“准加密的压缩包”方式进行传输。“准加密的压缩包”指的是：将包括网址，内容等相关HTTP数据打包压缩后，然后对压缩包头16个字节进行3DES加密。由于是压缩包的部分加密，故我称之为“准加密压缩包”。之所以采用“准加密”的方式是出于性能的考虑。　我认为（不知是否正确？）：头16个字节进行3DES加密的压缩包是无法破解的。这样就解决了由于网址暴露而导致的不完全性。</p>
<p>　　其实，上述方案(我称之为“客户端式HTTP代理”)就是“自×由×门”，“无×界”采用的方案，但由于“自×由×门／“无×界”的通用性而导致其不可靠性（会被定点封锁）。</p>
<p>　　于是我认为，越是个性化的翻墙方式越不可能会被定点封锁。goagent这款代理是一个很好切入点，其远程HTTP代理服务端(fetch.py)搭建在GoogleAppEngine上（免费的），本地HTTP代理就是一个python程序:proxy.py.&nbsp; </p>
<blockquote><p><a href="http://code.google.com/p/goagent/" target="_blank">http://code.google.com/p/goagent/</a></p>
<p><a href="https://github.com/phus/goagent" target="_blank">https://github.com/phus/goagent</a> </p>
</blockquote>
<p>　　我们可以对goagent这款客户端式代理进行改造，获得一个个性化安全的翻墙工具。（注：goagent交换的数据压缩包没有加密，也就不是完全安全的）。考虑到我的翻墙安全，我就不把改造后的程序公布了。仅仅介绍一下我对goagent做了哪些改造。</p>
<blockquote><p>１）远程HTTP代理服务端：　用Google　Go语言重新开发了，部署在GAE上，然后绑定到一个特定域名上。</p>
<p>２）本地和远程代理间的数据交换：采用了前述的“准加密压缩包”的形式进行传输。</p>
<p>３）本地HTTP代理服务端：　本想用Google　Go语言重新开发，但目前Go开发的程序还不能运行在Window操作系统下，故还是使用proxy.py。但是删除了大量代码，专注于通过远程GAE的代理。</p>
<p>４）保留了本地HTTPS劫持功能：在本地HTTP代理中自动伪造HTTPS证书，将用户的HTTPS请求进行劫持解密，然后按HTTP数据的“准加密压缩包”的方式传输。</p>
<p>５）将proxy.py原本单线程的运行模式改造成多线程的运行模式。</p>
</blockquote>
<p>　　最后，你们可能会失望了，我并没有给你提供了一个拿来即用的程序，仅仅是给你一个方法。这是因为如果具体程序一旦扩散开来，最终会遇到被定点封锁的命运。GAE已经被拦在“墙外”，本人是通过特殊方式绕过了拦截，一旦扩散开来会影响到我的使用。基于我的私心，就不公布具体程序：）</p>
<p style='text-align:left'>&copy; 2012, <a href='http://blog.chaoskey.com'>無處不在</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chaoskey.com/2012/02/21/201202212226/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HttpCore Tutorial－－第二章NIO扩展</title>
		<link>http://blog.chaoskey.com/2012/02/19/201202200934</link>
		<comments>http://blog.chaoskey.com/2012/02/19/201202200934#comments</comments>
		<pubDate>Mon, 20 Feb 2012 01:37:08 +0000</pubDate>
		<dc:creator>混沌</dc:creator>
				<category><![CDATA[读书笔记]]></category>
		<category><![CDATA[httpcore]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[nio]]></category>
		<category><![CDATA[翻译]]></category>

		<guid isPermaLink="false">http://zwzybzj.ixiezi.com/2012/02/19/201202200934</guid>
		<description><![CDATA[由于最近的项目要用到Apache HttpCore开源Java组件之非阻塞式I/O模式，顺手将《HttpCore Tutorial》之NIO扩展这章翻译了。 第二章 NIO扩展 2.1. 非阻塞式I/O模型的优缺点 与一般的观点相反：当原始数据吞吐量足够大时，NIO的执行性能要明显低于阻塞式IO。所以NIO并不一定适合所有的情况，只有如下几种情况可以考虑使用NIO： 　　• 需要处理成千上万个连接，但有相当数量的连接是空闲的。 　　• 需要处理高延迟的连接。 　　• 请求/响应处理需要被解耦。 2.2. 和其它的NIO框架的区别 虽然其它的框架也解决了类似的问题，但是此框架还是有些独特的地方： 　　• 极简抽象化,针对诸如Http协议的数据进行了优化. 　　• 高效内存管理: 数据消费当且仅当需要更多数据时才读取，并且不需要分配更多的内存。 　　• 可能的话,直接访问NIO通道. 2.3. I/O反应器 译者注：I/O反应器是I/O事件层的核心。 　　HttpCore NIO是基于Reactor模式的(曾被Doug Lea描述过的模式)。I/O反应器的目的是响应I/O事件并且分派事件通知给特定的I/O会话。I/O反应器模式的主要观念：打破经典阻塞式I/O模型下的一个连接一个线程的情况。IOReactor接口描绘了一个实现Reactor模式的抽象。在内部，IOReactor的实现类封装了NIO(java.nio.channels.Selector)的功能。 I/O反应器一般会用少量调度线程(常常是一个)分派I/O事件通知给数量相当大的(常常是数千个) I/O会话或连接。而这又是被推荐的方式：每个CPU核一个调度线程. HttpParams params = new BasicHttpParams(); int workerCount = 2; IOReactor ioreactor = new DefaultConnectingIOReactor(workerCount, 　　　　　　　　　　　　　params); 2.3.1. I/O调度 　　IOReactor的实现会使用IOEventDispatch接口将特定会话事件通知顾客。IOEventDispatch的所有方法都在I/O反应器的一个调度线程中执行。事件方法不要堵塞调度线程太久时间，这点很重要，因为一旦被堵了，I/O 反应器将不能反应其它事件。 HttpParams params = new [...]]]></description>
			<content:encoded><![CDATA[<p>由于最近的项目要用到Apache HttpCore开源Java组件之<font>非阻塞式I/O模式</font>，顺手将《HttpCore Tutorial》之NIO扩展这章翻译了。 </p>
<p><span id="more-1282659"></span><br />
<h1>第二章 NIO扩展</h1>
<h2>2.1. 非阻塞式I/O模型的优缺点</h2>
<p>与一般的观点相反：当原始数据吞吐量足够大时，NIO的执行性能要明显低于阻塞式IO。所以NIO并不一定适合所有的情况，只有如下几种情况可以考虑使用NIO：
<p>　　• 需要处理成千上万个连接，但有相当数量的连接是空闲的。
<p>　　• 需要处理高延迟的连接。
<p>　　• 请求/响应处理需要被解耦。<br />
<h2>2.2. 和其它的NIO框架的区别</h2>
<p>虽然其它的框架也解决了类似的问题，但是此框架还是有些独特的地方：
<p>　　• 极简抽象化,针对诸如Http协议的数据进行了优化.
<p>　　• 高效内存管理: 数据消费当且仅当需要更多数据时才读取，并且不需要分配更多的内存。
<p>　　• 可能的话,直接访问NIO通道.<br />
<h2>2.3. I/O反应器</h2>
<p>译者注：I/O反应器是I/O事件层的核心。
<p>　　HttpCore NIO是基于Reactor模式的(曾被Doug Lea描述过的模式)。I/O反应器的目的是响应I/O事件并且分派事件通知给特定的I/O会话。I/O反应器模式的主要观念：打破经典阻塞式I/O模型下的一个连接一个线程的情况。<b>IOReactor</b>接口描绘了一个实现Reactor模式的抽象。在内部，<b>IOReactor</b>的实现类封装了NIO(java.nio.channels.Selector)的功能。
<p>I/O反应器一般会用少量调度线程(常常是一个)分派I/O事件通知给数量相当大的(常常是数千个) I/O会话或连接。而这又是被推荐的方式：每个CPU核一个调度线程.<br />
<blockquote>
<p>HttpParams params = new BasicHttpParams();
<p>int workerCount = 2;
<p>IOReactor ioreactor = new DefaultConnectingIOReactor(workerCount,
<p>　　　　　　　　　　　　　params);</p>
</blockquote>
<h3><font color="#0000ff">2.3.1. I/O调度</font></h3>
<p>　　<b>IOReactor</b>的实现会使用<b>IOEventDispatch</b>接口将特定会话事件通知顾客。<b>IOEventDispatch</b>的所有方法都在I/O反应器的一个调度线程中执行。事件方法不要堵塞调度线程太久时间，这点很重要，因为一旦被堵了，I/O 反应器将不能反应其它事件。<br />
<blockquote>
<p>HttpParams params = new BasicHttpParams();
<p>IOReactor ioreactor = new DefaultConnectingIOReactor(2, params);
<p>IOEventDispatch eventDispatch = new MyIOEventDispatch();
<p>ioreactor.execute(eventDispatch);</p>
</blockquote>
<p>在<b>IOEventDispatch</b>接口中定义了一般的I/O事件:
<p>　　• connected: 当一个新的会话被创建时触发。
<p>　　• inputReady: 当会话即将有输入时触发。
<p>　　• outputReady: 当会话准备输出时触发。
<p>　　• timeout: 当会话超时触发。
<p>　　• disconnected: 当会话已经被终止时触发。<br />
<h3><font color="#0000ff">2.3.2. I/O反应器的关闭</font></h3>
<p>　　I/O反应器的关闭是一个复杂的过程，一般需要等待直到完全停止。I/O反应器将试图在指定的期限内温和地终止所有活动的I/O会话和调度线程。如果有任何I/O会话不能正确地终止，那么I/O反应器将强制关闭余下的会话。<br />
<blockquote>
<p>long gracePeriod = 3000L; // milliseconds
<p>ioreactor.shutdown(gracePeriod);</p>
</blockquote>
<p>IOReactor#shutdown(long) 方法必须是线程安全的。<br />
<h3><font color="#0000ff">2.3.3. I/O会话</font></h3>
<p>　　<b>IOSession</b>接口描绘了在两个端点(比如客户端和服务端)上进行数据交换逻辑序列。<b>IOSession</b>封装了NIO(java.nio.channels.SelectionKey和java.nio.channels.SocketChannel)的功能。一个通道关联一个<b>IOSession</b>,能够从会话中读取或写入数据。<br />
<blockquote>
<p>IOSession iosession;
<p>ReadableByteChannel ch = (ReadableByteChannel) iosession.channel();
<p>ByteBuffer dst = ByteBuffer.allocate(2048);
<p>ch.read(dst);</p>
</blockquote>
<h3><font color="#0000ff">2.3.4. I/O会话的状态管理</font></h3>
<p>I/O会话没有绑定到一个执行线程上，所以不能使用线程的上下文保存会话状态。特定会话的所有详情必须存储在会话自身。<br />
<blockquote>
<p>IOSession iosession;
<p>Object someState;
<p>iosession.setAttribute(&#8220;state&#8221;, someState);
<p>Object currentState = iosession.getAttribute(&#8220;state&#8221;);</p>
</blockquote>
<p>请注意：如果数个会话使用了共享对象，那么访问这些对象必须确保线程安全。<br />
<h3><font color="#0000ff">2.3.5. I/O会话事件掩码</font></h3>
<p>如果关注特定I/O会话的特定类型I/O事件，可以在此I/O会话中设置事件掩码。<br />
<blockquote>
<p>IOSession iosession;
<p>iosession.setEventMask(SelectionKey.OP_READ | SelectionKey.OP_WRITE);</p>
</blockquote>
<p>也可以单独触发OP_READ 和 OP_WRITE事件。<br />
<blockquote>
<p>iosession.setEvent(SelectionKey.OP_READ);
<p>iosession.clearEvent(SelectionKey.OP_READ);</p>
</blockquote>
<p>没有被设置标志位的相关事件通知不会被清空(就是原样不变)。<br />
<h3><font color="#0000ff">2.3.6. I/O会话的缓冲器</font></h3>
<p>　　为了能在返回数据给客户或写数据到基础通道之前进行输入输出数据转换，I/O会话经常要操纵内部I/O缓冲。HttpCore NIO的内存管理原理是基于：数据消费者当且仅当需要更多数据时才实际读取，而不需要分配更多的内存。这意味有一些在内部或外部缓冲的未读输入数据。I/O反应器能够查询这些会话缓冲的状态，并且确保数据消费者获得正确的通知(是否还有一些存储在某个会话缓冲中的数据？)，所以允许数据消费者在能处理的时候读取这些遗留数据。I/O会话能够知道外部会话缓冲状态，方法就是使用<b>SessionBufferStatus</b>接口。<br />
<blockquote>
<p>IOSession iosession;
<p>SessionBufferStatus myBufferStatus = new MySessionBufferStatus();
<p>iosession.setBufferStatus(myBufferStatus);
<p>iosession.hasBufferedInput();
<p>iosession.hasBufferedOutput();</p>
</blockquote>
<h3><font color="#0000ff">2.3.7. I/O会话的关闭</font></h3>
<p>　　可以调用IOSession#close()以温和有序的方式关闭I/O会话，或调用IOSession#shutdown()强制关闭I/O会话的基础通道。对具体的<b>IOSession</b>实现而言，上面两个方法的区别主要体现在：涉及有序的会话握手终止，比如SSL/TLS连接。<br />
<h3><font color="#0000ff">2.3.8. I/O监听反应器</font></h3>
<p><b>ListeningIOReactor</b>接口描述了能够在一个或多个端口上监听进站连接的I/O反应器。<br />
<blockquote>
<p>ListeningIOReactor ioreactor;
<p>ListenerEndpoint ep1 = ioreactor.listen(new InetSocketAddress(8081));
<p>ListenerEndpoint ep2 = ioreactor.listen(new InetSocketAddress(8082));
<p>ListenerEndpoint ep3 = ioreactor.listen(new InetSocketAddress(8083));
<p>// Wait until all endpoints are up
<p>ep1.waitFor();
<p>ep2.waitFor();
<p>ep3.waitFor();</p>
</blockquote>
<p>　　一个端点一旦完全初始化，就能开始够接受进站连接，并且能够将I/O活动通知给<b>IOEventDispatch</b>接口。
<p>也能够获得运行时已注册的端点集，能够查询运行时的一个端点的状态，并且也能够关闭它。<br />
<blockquote>
<p>ListeningIOReactor ioreactor;
<p>Set&lt;ListenerEndpoint&gt; eps = ioreactor.getEndpoints();
<p>for (ListenerEndpoint ep: eps) {
<p>　　// Still active?
<p>　　System.out.println(ep.getAddress());
<p>　　if (ep.isClosed()) {
<p>　　　　// If not, has it terminated due to an exception?
<p>　　　　if (ep.getException() != null) {
<p>　　　　　　ep.getException().printStackTrace();
<p>　　　　}
<p>　　} else {
<p>　　　　ep.close();
<p>　　}
<p>}</p>
</blockquote>
<h3><font color="#0000ff">2.3.9. I/O连接反应器</font></h3>
<p><b>ConnectingIOReactor</b>描绘了一个能够和远端主机建立连接的I/O反应器。<br />
<blockquote>
<p>ConnectingIOReactor ioreactor;
<p>SessionRequest sessionRequest = ioreactor.connect(
<p>　　　　　　　　new InetSocketAddress(&#8220;www.google.com&#8221;, 80),
<p>　　　　　　　　null, null, null);</p>
</blockquote>
<p>打开一个到远端主机的连接通常要消耗一定的处理时间来确保其完成。然后通过<b>SessionRequest</b>接口来监控在建立连接过程中的会话初始化。<br />
<blockquote>
<p>// Make sure the request times out if connection
<p>// has not been established after 1 sec
<p>sessionRequest.setConnectTimeout(1000);
<p>// Wait for the request to complete
<p>sessionRequest.waitFor();
<p>// Has request terminated due to an exception?
<p>if (sessionRequest.getException() != null) {
<p>　　sessionRequest.getException().printStackTrace();
<p>}
<p>// Get hold of the new I/O session
<p>IOSession iosession = sessionRequest.getSession();</p>
</blockquote>
<p>预期<b>SessionRequest</b>的实现是线程安全的。会话请求可以在任何时刻在其它线程中通过调用IOSession#cancel()而中止。<br />
<blockquote>
<p>if (!sessionRequest.isCompleted()) {
<p>　　sessionRequest.cancel();
<p>}</p>
</blockquote>
<p>　　可以通过ConnectingIOReactor#connect()的可选参数来控制会话的初始化处理。
<p>一个非空的本地socket地址参数可以被用来将socket绑定到特定的本地地址上(connect的第二个参数)。<br />
<blockquote>
<p>ConnectingIOReactor ioreactor;
<p>SessionRequest sessionRequest = ioreactor.connect(
<p>　　new InetSocketAddress(&#8220;www.google.com&#8221;, 80),
<p>　　new InetSocketAddress(&#8220;192.168.0.10&#8243;, 1234),
<p>　　null, null);</p>
</blockquote>
<p>可以将一个附件对象通过connect的第三个参数绑定到返回<b>SessionRequest</b>中所携带的会话上。<br />
<blockquote>
<p>SessionRequest sessionRequest = ioreactor.connect(
<p>　　new InetSocketAddress(&#8220;www.google.com&#8221;, 80),
<p>　　null, new HttpHost(&#8220;www.google.ru&#8221;), null);
<p>IOSession iosession = sessionRequest.getSession();
<p>HttpHost virtualHost = (HttpHost) iosession.getAttribute(
<p>　　IOSession.ATTACHMENT_KEY);</p>
</blockquote>
<p>　　也可以令人满意地进行异步连接而无需等待，不会堵塞当前线程的执行。可以通过<b>SessionRequestCallback</b>接口作为connect的第四个参数来实现这点。通过这个接口可以获得关于<b>SessionRequest</b>的事件，比如：请求完成(completed(…))，取消(cancelled(…))，失败(failed(…))和超时(timeout(…))。<br />
<blockquote>
<p>ConnectingIOReactor ioreactor;
<p>SessionRequest sessionRequest = ioreactor.connect(
<p>　　new InetSocketAddress(&#8220;www.google.com&#8221;, 80), null, null,
<p>　　new SessionRequestCallback() {
<p>　　　　public void cancelled(SessionRequest request) {
<p>　　　　}
<p>　　　　public void completed(SessionRequest request) {
<p>　　　　　　System.out.println(&#8220;new connection to &#8221; +
<p>　　　　　　request.getRemoteAddress());
<p>　　　　}
<p>　　　　public void failed(SessionRequest request) {
<p>　　　　　　if (request.getException() != null) {
<p>　　　　　　　　request.getException().printStackTrace();
<p>　　　　　　}
<p>　　　　}
<p>　　　　public void timeout(SessionRequest request) {
<p>　　　　}
<p>　　});</p>
</blockquote>
<h3><font color="#0000ff">2.3.10. 队列化的I/O interest集操作</font></h3>
<p>　　有几个老的JRE实现(主要是来自IBM的实现,可以参考Java API文档中关于java.nio.channels.SelectionKey类本地实现的注解)。java.nio.channels.SelectionKey在这些JRE上问题是：如果正在进行某个选择操作，那么读取或写入 interest 集合可能会无限期地阻塞。在上述特殊情况下，HttpCore NIO能够配置在调度线程中以队列化的方式执行interest 集合的操作，当然是在I/O selector的select操作不忙的时候实质执行<br />
<blockquote>
<p>HttpParams params = new BasicHttpParams();
<p>NIOReactorParams.setInterestOpsQueueing(params, true);
<p>ListeningIOReactor ioreactor = new DefaultListeningIOReactor(2, params);</p>
</blockquote>
<h2>2.4. I/O反应器的异常处理</h2>
<p>　　和I/O异常类似，协议层的异常也是一种和会话通道交互过程中抛出的异常。可预期由特殊的协议处理者(protocol handlers)进行处理。这些异常可能会导致个别会话终止，但应该不会影响到I/O反应器和其他活动的会话。然而也可能有另外一种情况：I/O反应器自身遭遇到一个内部错误(比如基础NIO类的I/O异常或者一个未处理的运行时异常)。这种类型的异常通常是致命的，并且会导致I/O反应器自动关闭。
<p>当然还是有可能通过重载一些行为来阻止I/O反应器由于运行时异常或内部类的I/O异常而导致的自动停机。那就是技巧性的定制<b>IOReactorExceptionHandler</b>接口的一个实现。<br />
<blockquote>
<p>DefaultConnectingIOReactor ioreactor;
<p>ioreactor.setExceptionHandler(new IOReactorExceptionHandler() {
<p>　　public boolean handle(IOException ex) {
<p>　　　　if (ex instanceof BindException) {
<p>　　　　　　// bind failures considered OK to ignore
<p>　　　　　　return true;
<p>　　　　}
<p>　　　　return false;
<p>　　}
<p>　　public boolean handle(RuntimeException ex) {
<p>　　　　if (ex instanceof UnsupportedOperationException) {
<p>　　　　　　// Unsupported operations considered OK to ignore
<p>　　　　　　return true;
<p>　　　　}
<p>　　　　return false;
<p>　　}
<p>});</p>
</blockquote>
<p>需要非常小心对待不加区别地异常丢弃。让I/O反应器关闭自身再干净地重启，通常要好于在不一致的或不稳定状态下继续运行。<br />
<h3><font color="#0000ff">2.4.1. I/O反应器的旁听日志</font></h3>
<p>　　如果I/O反应器不能够自动地从运行时或I/O异常中恢复过来，那么她将会进入shutdown模式。首先，她将关闭活动的监听反应器并且取消即将的会话请求。然后她将试图在给定时间期限下温和地关闭活动的I/O会话，以便刷新输出和终止前的清理工作。最后，超过时间期限，她将强制关闭余下活动I/O会话。这是一个相当复杂的过程。可能会导致许多失败，抛出很多异常甚至导致关闭整个进程(如果我只希望关闭单个反应器，那么关闭整个进程就不是我们希望看到的)。I/O反应器将会记录这些在关闭过程抛出的异常和导致进入shutdown模式的异常，这些异常保存在一个旁听日志(audit log)对象中。可以通过检查这个日志对象来决定是否能安全地重新启动I/O反应器。<br />
<blockquote>
<p>DefaultConnectingIOReactor ioreactor;
<p>// Give it 5 sec grace period
<p>ioreactor.shutdown(5000);
<p>List&lt;ExceptionEvent&gt; events = ioreactor.getAuditLog();
<p>for (ExceptionEvent event: events) {
<p>　　System.err.println(&#8220;Time: &#8221; + event.getTimestamp());
<p>　　event.getCause().printStackTrace();
<p>}</p>
</blockquote>
<h2>2.5. 非阻塞式HTTP连接</h2>
<p>　　一个有效的<b>非阻塞式</b><b>HTTP</b><b>连接</b>封装了满足HTTP规范的IOSession。<b>非阻塞式</b><b>HTTP</b><b>连接</b>是有状态的，但不是线程安全的。<b>非阻塞式</b><b>HTTP</b><b>连接</b>的输入/输出操作应该被严格限制：由同一个I/O 调度线程来执行其触发的所有调度事件。<br />
<h3><font color="#0000ff">2.5.1. 非阻塞式HTTP连接的执行上下文</font></h3>
<p>　　<b>非阻塞式HTTP</b><b>连接</b>不是绑定在一个特定的线程上执行，所以它们需要维持自己的执行上下文。每个<b>非阻塞式</b><b>HTTP</b><b>连接</b>有一个关联的<b>HttpContext</b>实例，它可被用来维护一个处理状态。这个<b>HttpContext</b>实例是线程安全的，能够被多个线程操作。<br />
<blockquote>
<p>// Get non-blocking HTTP connection
<p>DefaultNHttpClientConnection conn;
<p>// State
<p>Object myStateObject;
<p>HttpContext context = conn.getContext();
<p>context.setAttribute(&#8220;state&#8221;, myStateObject);</p>
</blockquote>
<h3><font color="#0000ff">2.5.2. 非阻塞式HTTP连接的工作</font></h3>
<p>　　在任何时刻，都能够获得<b>非阻塞式</b><b>HTTP</b><b>连接</b>的请求和响应对象，无论这些对象是否已经被传递了。如果当前还没有进站或出站的消息传输，获取到的任何请求或响应对象可能是空，甚至可能同时为空。<br />
<blockquote>
<p>NHttpConnection conn;
<p>HttpRequest request = conn.getHttpRequest();
<p>if (request != null) {
<p>　　System.out.println(&#8220;Transferring request: &#8221; +
<p>　　request.getRequestLine());
<p>}
<p>HttpResponse response = conn.getHttpResponse();
<p>if (response != null) {
<p>　　System.out.println(&#8220;Transferring response: &#8221; +
<p>　　response.getStatusLine());
<p>}</p>
</blockquote>
<p>　　无论如何，请注意的是当前请求和当前响应并不必然表示发生了同样的消息交换。<b>非阻塞式</b><b>HTTP</b><b>连接</b>能在完全双工模式下操作。可以完全相互独立地处理进站和出站消息。这使得<b>非阻塞式</b><b>HTTP</b><b>连接</b>能够完全管道化，但是也意味着匹配请求和响应的逻辑关系也是协议处理者(protocol handler)的工作。
<p>在客户端的简单请求提交过程，看起来像：<br />
<blockquote>
<p>// Obtain HTTP connection
<p>NHttpClientConnection conn;
<p>// Obtain execution context
<p>HttpContext context = conn.getContext();
<p>// Obtain processing state
<p>Object state = context.getAttribute(&#8220;state&#8221;);
<p>// Generate a request based on the state information
<p>HttpRequest request = new BasicHttpRequest(&#8220;GET&#8221;, &#8220;/&#8221;);
<p>conn.submitRequest(request);
<p>System.out.println(conn.isRequestSubmitted());</p>
</blockquote>
<p>服务端的简单响应提交过程，看起来像：<br />
<blockquote>
<p>// Obtain HTTP connection
<p>NHttpServerConnection conn;
<p>// Obtain execution context
<p>HttpContext context = conn.getContext();
<p>// Obtain processing state
<p>Object state = context.getAttribute(&#8220;state&#8221;);
<p>// Generate a response based on the state information
<p>HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,
<p>HttpStatus.SC_OK, &#8220;OK&#8221;);
<p>BasicHttpEntity entity = new BasicHttpEntity();
<p>entity.setContentType(&#8220;text/plain&#8221;);
<p>entity.setChunked(true);
<p>response.setEntity(entity);
<p>conn.submitResponse(response);
<p>System.out.println(conn.isResponseSubmitted());</p>
</blockquote>
<p>请注意的是：使用低级别的方法进行消息传输是很少见的，并且应该使用高级别Http服务(service)的实现来代替。<br />
<h3><font color="#0000ff">2.5.3. HTTP的I/O控制</font></h3>
<p>　　所有的<b>非阻塞式</b><b>HTTP</b><b>连接</b>类都实现了<b>IOControl</b>接口，该接口作为连接功能的子集能够控制其关注的I/O事件通知。<b>IOControl</b>实例能够完全线程安全地执行。所以<b>IOControl</b>能够在任何线程上<b>request</b> / <b>suspend</b> I/O事件通知。
<p>　　必须小心谨慎地对待和<b>非阻塞式连接</b>的交互。<b>HttpRequest</b>和<b>HttpResponse</b>不是线程安全的。一般而言，将某个<b>非阻塞式连接</b>上所有的输入输出操作都限制在同一个I/O事件调度线程上执行的方式是明智的。
<p>推荐的几种模式：
<p>　　• 使用<b>IOControl</b>接口从另外一个线程/会话来控制连接的I/O事件。
<p>　　• 如果输入输出操作需要在一个特定的连接上执行，那么需要在连接上下文中存储所有的请求信息(状态)，并且通过调用IOControl#requestInput()或IOControl#requestOutput()方法来发起适当的请求操作。
<p>　　• 使用存储在连接上的上下文信息，在调度线程事件方法中执行请求操作。
<p>请注意：发生在事件方法中的所有操作不应该阻塞太长时间，因为一旦调度线程在一个会话中被堵塞，它将不能处理所有其他会话中的事件。会话的基础通道的I/O操作能够保证其非堵塞性。<br />
<h3><font color="#0000ff">2.5.4. 非阻塞式内容传递</font></h3>
<p>　　<b>非阻塞式连接</b>上的内容传输过程的工作完全不同于<b>阻塞式连接</b>，作为<b>非阻塞式连接</b>需要适应NIO模型的自然异步性。两种连接类型最主要的区别是：无法使用平常的，但具有内在阻塞性的java.io.InputStream和 java.io.OutputStream类(在这里被用来作为内容的输入输出流)。HttpCore NIO提供了<b>ContentEncoder</b>和<b>ContentDecoder</b>接口来处理异步内容传输过程。<b>非阻塞式</b><b>HTTP</b><b>连接</b>将实例化一个恰当的内容编解码器(content codec),它是消息体的一个属性。
<p><b>非阻塞式HTTP</b><b>连接</b>将激活输入事件，直到消息体的内容完全被传输。<br />
<blockquote>
<p>//Obtain content decoder
<p>ContentDecoder decoder;
<p>//Read data in
<p>ByteBuffer dst = ByteBuffer.allocate(2048);
<p>decoder.read(dst);
<p>// Decode will be marked as complete when
<p>// the content entity is fully transferred
<p>if (decoder.isCompleted()) {
<p>　　// Done
<p>}</p>
</blockquote>
<p><b>非堵塞式HTTP</b><b>连接</b>将激活输出事件，直到消息体的内容已被标记为完全传输。<br />
<blockquote>
<p>// Obtain content encoder
<p>ContentEncoder encoder;
<p>// Prepare output data
<p>ByteBuffer src = ByteBuffer.allocate(2048);
<p>// Write data out
<p>encoder.write(src);
<p>// Mark content entity as fully transferred when done
<p>encoder.complete();</p>
</blockquote>
<p>请注意：可用<b>HttpEntity</b>的一个实例作为消息体，将一个含消息体的消息提交到<b>非阻塞式</b><b>HTTP</b><b>连接</b>。用消息体的属性初始化一个<b>ContentEncoder</b>实例进行消息体内容传输。然而，<b>非堵塞式HTTP</b><b>连接</b>会忽略内在阻塞性的方法HttpEntity#getContent()和HttpEntity#writeTo()。<br />
<blockquote>
<p>// Obtain HTTP connection
<p>NHttpServerConnection conn;
<p>HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,
<p>　　HttpStatus.SC_OK, &#8220;OK&#8221;);
<p>BasicHttpEntity entity = new BasicHttpEntity();
<p>entity.setContentType(&#8220;text/plain&#8221;);
<p>entity.setChunked(true);
<p>entity.setContent(null);
<p>response.setEntity(entity);
<p>conn.submitResponse(response);</p>
</blockquote>
<p>同样，含消息体的进站消息也将有一个<b>HttpEntity</b> 实例相关联，但调用HttpEntity#getContent()或HttpEntity#writeTo()的企图会导致java.lang.IllegalStateException。根据<b>HttpEntity</b>实例可以确定诸如content length之类的进站消息体性质。<br />
<blockquote>
<p>// Obtain HTTP connection
<p>NHttpClientConnection conn;
<p>HttpResponse response = conn.getHttpResponse();
<p>HttpEntity entity = response.getEntity();
<p>if (entity != null) {
<p>　　System.out.println(entity.getContentType());
<p>　　System.out.println(entity.getContentLength());
<p>　　System.out.println(entity.isChunked());
<p>}</p>
</blockquote>
<h3><font color="#0000ff">2.5.5. 支持的非阻塞式内容传递机制</font></h3>
<p><b>非阻塞式HTTP</b><b>连接</b>的默认实现支持三种内容传输机制（定义在HTTP/1.1规范中):
<p>　　• 由Content-Length确定:消息体的终止由消息头中Content-Length的值确定.最大消息体长度: Long#MAX_VALUE。
<p>　　• 标识码：消息体的终止由基础连接的关闭决定(流终止条件)。基于明显的原因，标识码只能用在服务端。最大消息体长度：无限制。
<p>　　• 成块编码 (Chunk coding)：内容被成块发送。最大实体长度：无限制。
<p>一个恰当的内容编解码器(content codec)会根据消息体性质自动创建。
<p>I/O反应器，I/O会话和I/O事件调度，他们三者的关系”心脏－血液－肢体”的关系。　<br />
<h3><font color="#0000ff">2.5.6. 直接通道I/O </font></h3>
<p>　　内容编码器优化了从I/O会话基础通道的直接数据读取或数据写入，任何时候都可能绕过会话的缓冲，此外这些不执行任何转换(Content-Length限定和标识码等)的编解码器能够有效地利用NIO java.nio.FileChannel的方法提高入站/出站数据的传输性能。
<p>译者注：在这个数据的转换过程中，可以在完全进行数据读写完毕后进行适当的代码处理。在这个内容的传递机制的过程中，完成这个的函数的分析过程。对
<p>一个实际的内容解码器实现<b>FileContentDecoder</b>就能够直接读取文件入站内容，并且绕过了中间缓冲java.nio.ByteBuffer。<br />
<blockquote>
<p>//Obtain content decoder
<p>ContentDecoder decoder;
<p>//Prepare file channel
<p>FileChannel dst;
<p>//Make use of direct file I/O if possible
<p>if (decoder instanceof FileContentDecoder) {
<p>　　long Bytesread = ((FileContentDecoder) decoder)
<p>　　　　.transfer(dst, 0, 2048);
<p>　　// Decode will be marked as complete when
<p>　　// the content entity is fully transmitted
<p>　　if (decoder.isCompleted()) {
<p>　　　　// Done
<p>　　}
<p>}</p>
</blockquote>
<p>一个实际的内容编码器实现<b>FileContentEncoder</b>就能够直接写出站内容到文件，并且绕过了中间缓冲java.nio.ByteBuffer.。<br />
<blockquote>
<p>// Obtain content encoder
<p>ContentEncoder encoder;
<p>// Prepare file channel
<p>FileChannel src;
<p>// Make use of direct file I/O if possible
<p>if (encoder instanceof FileContentEncoder) {
<p>　　// Write data out
<p>　　long bytesWritten = ((FileContentEncoder) encoder)
<p>　　　　.transfer(src, 0, 2048);
<p>　　// Mark content entity as fully transferred when done
<p>　　encoder.complete();
<p>}</p>
</blockquote>
<h2>2.6. HTTP I/O事件调度</h2>
<p>译者注：HTTP I/O事件调度是I/O事件转换成HTTP协议事件中介。
<p>　　HTTP I/O事件调度器可通过I/O反应器将一般的已触发I/O事件转换为特定的HTTP协议事件。他们依赖<b>NHttpClientHandler</b>和<b>NHttpServiceHandler</b>接口将HTTP协议事件传递给HTTP协议处理(handler).
<p><b>NHttpServiceHandler</b>接口定义了服务端HTTP I/O事件：
<p>　　•connected: 当一个新的进站连接成功建立后触发。
<p>　　•requestReceived: 当已经接收到一个HTTP请求时触发。通过本方法的参数(<b>NHttpServerConnection</b>)可以确保获得一个有效的<b>HttpRequest</b>对象。如果已经接收的请求包含消息体,那么这个方法随后会有一系列inputReady事件来传输请求消息体的内容。
<p>　　•inputReady: 当已经准备好从基础通道中读请求消息体新的部分(经过内容解码器)时触发。如果内容消费不能处理这些入站内容，那么能够使用<b>IOControl</b>接口将输入事件通知临时性挂起。
<p>　　•responseReady: 当连接已经准备接受新的<b>HttpResponse</b>时触发。如果连接没有准备好，那么协议处理者(handler)是不能提交响应的。
<p>　　•outputReady: 当基础通道已经准备好写入响应消息体的下一个部分(经过内容编码器)时触发。如果内容生产者不能产生出站内容，那么能够使用<b>IOControl</b>接口将输出事件通知临时性挂起。
<p>　　•exception: 当读写基础通道发生一个I/O错误时，或者在接受<b>HttpRequest</b>发生HTTP协议违反时触发。
<p>　　•timeout: 当在设定的时间期限内没有探测到输入时触发。
<p>　　•closed: 当连接已经被关闭时触发。
<p><b>NHttpClientHandler</b>接口定义了客户端HTTP I/O事件：
<p>　　•connected: 当出站连接已成功建立时触发。作为参数的附件对象就是会话请求(<b>SessionRequest</b>)的附件。
<p>　　•requestReady: 当连接已经准备好接受HTTP请求时触发。如果连接没有准备好，那么协议处理者(handle)是不能提交请求的。
<p>　　•outputReady: 当基础通道已准备写入请求消息体的下一个部分(通过内容编码器)时触发。如果内容生产者不能产生出站内容，那么能够使用<b>IOControl</b>接口将输出事件通知临时性挂起。
<p>　　•responseReceived: 当一个<b>HttpResponse</b>被接受时触发。通过本方法的参数(<b>NHttpClientConnection</b>)可以确保获得一个有效的<b>HttpResponse</b>对象。如果已经接收的响应包含消息体,那么这个方法随后会有一系列inputReady事件来传输响应消息体的内容。
<p>　　•inputReady: 当已经准备好从基础通道中读响应消息体新的部分(通过内容解码器)时触发。如果内容消费不能处理这些入站内容，那么能够使用<b>IOControl</b>接口将输入事件通知临时性挂起。
<p>　　•exception: 当读写基础通道发生一个I/O错误时，或者在接受<b>HttpResponse</b>发生HTTP协议违反时触发。
<p>　　•timeout: 当在设定的时间期限内没有探测到输入时触发。
<p>　　•closed: 当连接已经被关闭时触发。<br />
<h2>2.7. 非阻塞式HTTP消息体</h2>
<p>　　前面的讨论已经提及：<b>非阻塞式连接</b>的工作过程和<b>阻塞式连接</b>完全不一样。一个明显的原因是经典I/O抽象是基于具有内在阻塞性的java.io.InputStream和java.io.OutputStream两个类，不能处理异步数据传输。所以非阻塞式HTTP消息体提供了对<b>HttpEntity</b>接口进行NIO特殊扩展的接口：<b>ProducingNHttpEntity</b>和<b>ConsumingNHttpEntity</b>。
<p>　　如果接口的特定实现类不能从java.io.InputStream实例获得内容流或不能将内容流写入java.io.OutputStream，那么可能会从HttpEntity#getContent()和HttpEntity#writeTo()抛出java.lang.UnsupportedOperationException。<br />
<h3><font color="#0000ff">2.7.1. 消费性内容的非阻塞式HTTP消息体</font></h3>
<p><b>ConsumingNHttpEntity</b>接口描绘了允许从内容解码器消费的非阻塞式消息体。
<p><b>ConsumingNHttpEntity</b>继承自<b>HttpEntity</b>接口，新添几个特定的NIO通知方法:
<p>　　•consumeContent: 有可消费内容的通知。通过<b>ContentDecoder</b>(第一个参数)获得有效可读内容。如果出现临时性的消息体不能为进站内容分配更多存储的情况，那么可通过<b>IOControl</b>(第二个参数)挂起输入事件。
<p>　　•finish: 由于读而分配的资源的释放通知。
<p>HttpCore NIO提供的<b>ConsumingNHttpEntity</b>实现：
<p>　　•<b>BufferingNHttpEntity</b>
<p>　　•<b>ConsumingNHttpEntityTemplate</b><br />
<h4><font color="#9b00d3">2.7.1.1. BufferingNHttpEntity </font></h4>
<p>　　<b>BufferingNHttpEntity</b>是<b>HttpEntityWrapper</b>的子类，它将所有进站内容存储进内存。一旦消息体内容完全被接受，就可以通过HttpEntity#getContent()获得java.io.InputStream，或者通过HttpEntity#writeTo()写到输出流。<br />
<h4><font color="#9b00d3">2.7.1.2. ConsumingNHttpEntityTemplate </font></h4>
<p><b>ConsumingNHttpEntityTemplate</b>是<b>HttpEntityWrapper</b>的子类，它装饰了入站<b>HttpEntity</b>并且委托<b>ContentListener</b>实例来处理入站内容。<br />
<blockquote>
<p>static class FileWriteListener implements ContentListener {
<p>　　private final FileChannel fileChannel;
<p>　　private long idx = 0;
<p>　　public FileWriteListener(File file) throws IOException {
<p>　　　　this.fileChannel = new FileInputStream(file).getChannel();
<p>　　}
<p>　　public void contentAvailable(
<p>　　　　ContentDecoder decoder, IOControl ioctrl) throws IOException {
<p>　　　　long transferred;
<p>　　　　if (decoder instanceof FileContentDecoder) {
<p>　　　　　　transferred = ((FileContentDecoder) decoder).transfer(
<p>　　　　　　　　fileChannel, idx, Long.MAX_VALUE);
<p>　　　　} else {
<p>　　　　　　transferred = fileChannel.transferFrom(
<p>　　　　　　　　new ContentDecoderChannel(decoder),
<p>　　　　　　　　idx, Long.MAX_VALUE);
<p>　　　　}
<p>　　　　if (transferred &gt; 0) {
<p>　　　　idx += transferred;
<p>　　　　}
<p>　　}
<p>　　public void finished() {
<p>　　　　try {
<p>　　　　　　fileChannel.close();
<p>　　　　} catch(IOException ignored) {}
<p>　　}
<p>}
<p>HttpEntity incomingEntity;
<p>File file = new File(&#8220;buffer.bin&#8221;);
<p>ConsumingNHttpEntity entity = new ConsumingNHttpEntityTemplate(
<p>　　　　incomingEntity,
<p>　　　　new FileWriteListener(file));</p>
</blockquote>
<h3><font color="#0000ff">2.7.2. 生产性内容的非阻塞式HTTP消息体</font></h3>
<p><b>ProducingNHttpEntity</b>接口描绘了允许内容写到内容编码器的非阻塞式实体。
<p><b>ProducingNHttpEntity</b>继承至<b>HttpEntity</b>接口，新添几个特定的NIO通知方法:
<p>　　•produceContent: 内容可以写到编码器(第一个参数)的通知。如果消息体生产过多的内容，那么可通过<b>IOControl</b>(第二个参数)临时性挂起输出事件。请注意：必须调用ContentEncoder#complete()通知基础连接：所有的内容已经写完。如果不这样做，可能会导致不正确的消息体界定。
<p>　　•finish: 由于写而分配的资源的释放通知。
<p>HttpCore NIO提供的<b>ProducingNHttpEntity</b>实现：
<p>　　• <b>NByteArrayEntity</b>
<p>　　• <b>NStringEntity</b>
<p>　　• <b>NFileEntity</b><br />
<h4><font color="#9b00d3">2.7.2.1. NByteArrayEntity </font></h4>
<p>这是一个简单的自包含可重复消息体,它从字节数组中接受它的内容。这个字节数组被提供给构造函数。
<p>String myData = &#8220;Hello world on the other side!!&#8221;;
<p>NByteArrayEntity entity = new NByteArrayEntity(myData.getBytes());<br />
<h4><font color="#9b00d3">2.7.2.2. NStringEntity </font></h4>
<p>这是一个简单的自包含可重复消息体,它从java.lang.String对象中获得它的数据。它有两个构造函数，一个简单地用给定的字符串为参数的构造函数，另一个同时指定了字符串数据的字符编码。<br />
<blockquote>
<p>String myData = &#8220;Hello world on the other side!!&#8221;;
<p>// construct without a character encoding
<p>NStringEntity myEntity1 = new NStringEntity(myData);
<p>// alternatively construct with an encoding
<p>NStringEntity myEntity2 = new NStringEntity(myData, &#8220;UTF-8&#8243;);</p>
</blockquote>
<h4><font color="#9b00d3">2.7.2.3. NFileEntity</font> </h4>
<p>这个实体从文件中读取内容体。这个类最常用在各种类型大文件流上，所以需要支持文件的内容类型，以确保能正确地验证和接受处理。<br />
<blockquote>
<p>File staticFile = new File(&#8220;/path/to/myapp.jar&#8221;);
<p>NFileEntity entity = new NFileEntity(staticFile,
<p>　　　　&#8221;application/java-archive&#8221;);</p>
</blockquote>
<p><b>NFileEntity</b>将尽可能使用直接通道I/O,提供的内容编码器能够直接从文件传输数据到基础连接的socket。<br />
<h2>2.8. 非阻塞式HTTP协议处理</h2>
<h3><font color="#0000ff">2.8.1. 服务端异步HTTP协议处理</font></h3>
<p>　　<b>AsyncNHttpServiceHandle</b>是一个完全异步的服务端HTTP协议处理者，它实现了HTTP协议中服务端消息处理的基本需求(RFC2616)。对特定的HTTP连接而言，<b>AsyncNHttpServiceHandler</b>具有在接近常数内存消耗下处理HTTP请求的能力。当使用<b>ConsumingNHttpEntity</b>或<b>ProducingNHttpEntity</b>将消息体的内容直接从消息体流向基础通道(或相反方向)时，这个处理者在内存中保存了HTTP消息头。
<p>　　当使用这个实现时，必须保证消息体支持并实现了<b>ProducingNHttpEntity</b>的写。这样做将允许消息体进行异步写。如果消息体所支持的写没有实现<b>ProducingNHttpEntity</b>接口，那么一个委托会被添加：全部的内容会缓存在内存中。此外，这个缓存动作可能会发生在I/O调度线程中，可能会导致I/O暂时性阻塞。最好是，确保<b>NHttpRequestHandler</b>中，在HTTP响应中设置的所有的消息体都实现了<b>ProducingNHttpEntity</b> 接口。
<p>　　如果进站请求附带有消息体,<b>NHttpRequestHandler</b>接口被期望能返回一个<b>ConsumingNHttpEntity</b>,便于读内容。在消息体完成数据读后，NHttpRequestHandler#handle()会被调用生成响应。
<p>　　<b>AsyncNHttpServiceHandler</b>依赖于<b>HttpProcessor</b>对出站消息生成的消息头，以及对所有进站/出站消息进行一般的，交叉的消息转换，然而个别的HTTP请求处理者还被期望能够照顾到特定内容的生成和处理。<br />
<blockquote>
<p>HttpParams params;
<p>// Initialize HTTP parameters
<p>HttpProcessor httpproc;
<p>// Initialize HTTP processor
<p>AsyncNHttpServiceHandler handler = new AsyncNHttpServiceHandler(
<p>　　　　httpproc,
<p>　　　　new DefaultHttpResponseFactory(),
<p>　　　　new DefaultConnectionReuseStrategy(),
<p>　　　　params);</p>
</blockquote>
<h4><font color="#9b00d3">2.8.1.1. 非阻塞式HTTP请求处理者</font></h4>
<p>　　<b>NHttpRequestHandler</b>接口描绘了特定的一类非阻塞式HTTP请求的处理程序。<b>NHttpRequestHandler</b>的实现被期望能够实现协议方面或应用方面的特殊需求。请求处理者的主要目的是根据请求产生能够响应给客户端一个含消息体的响应对象。<br />
<blockquote>
<p>NHttpRequestHandler myRequestHandler = new NHttpRequestHandler() {
<p>　　public ConsumingNHttpEntity entityRequest(
<p>　　　　HttpEntityEnclosingRequest request,
<p>　　　　HttpContext context) throws HttpException, IOException {
<p>　　　　// Buffer incoming content in memory for simplicity
<p>　　　　return new BufferingNHttpEntity(request.getEntity(),
<p>　　　　new HeapByteBufferAllocator());
<p>　　}
<p>　　public void handle(
<p>　　　　HttpRequest request,
<p>　　　　HttpResponse response,
<p>　　　　NHttpResponseTrigger trigger,
<p>　　　　HttpContext context) throws HttpException, IOException {
<p>　　　　　　response.setStatusCode(HttpStatus.SC_OK);
<p>　　　　　　response.addHeader(&#8220;Content-Type&#8221;, &#8220;text/plain&#8221;);
<p>　　　　　　response.setEntity(new NStringEntity(&#8220;some important message&#8221;));
<p>　　　　　　// Submit response immediately for simplicity
<p>　　　　　　trigger.submitResponse(response);
<p>　　}
<p>};</p>
</blockquote>
<p>请求处理者的实现必须是线程安全的。和servlet相似，请求处理者不应该使用实例变量，除非要同步化访问其变量。<br />
<h4><font color="#9b00d3">2.8.1.2. 异步响应触发器</font></h4>
<p>　　非阻塞式和阻塞式请求处理者最根本的差别是：延迟给客户端响应，而不阻塞I/O线程并将HTTP请求的处理过程转交给工作者线程的能力。一旦响应变得可用，工作者线程能够在随后的时刻，使用含参数<b>NHttpResponseTrigger</b> 的NHttpRequestHandler#handle方法来提交响应。<br />
<blockquote>
<p>NHttpRequestHandler myRequestHandler = new NHttpRequestHandler() {
<p>　　public ConsumingNHttpEntity entityRequest(
<p>　　　　HttpEntityEnclosingRequest request,
<p>　　　　HttpContext context) throws HttpException, IOException {
<p>　　　　　　// Buffer incoming content in memory for simplicity
<p>　　　　　　return new BufferingNHttpEntity(request.getEntity(),
<p>　　　　　　new HeapByteBufferAllocator());
<p>　　}
<p>　　public void handle(
<p>　　　　HttpRequest request,
<p>　　　　HttpResponse response,
<p>　　　　NHttpResponseTrigger trigger,
<p>　　　　HttpContext context) throws HttpException, IOException {
<p>　　　　　　new Thread() {
<p>　　　　　　　　@Override
<p>　　　　　　　　public void run() {
<p>　　　　　　　　　　try {
<p>　　　　　　　　　　　　Thread.sleep(10);
<p>　　　　　　　　　　}catch(InterruptedException ie) {}
<p>　　　　　　　　　　try {
<p>　　　　　　　　　　　　URI uri = new URI(request.getRequestLine().getUri());
<p>　　　　　　　　　　　　response.setStatusCode(HttpStatus.SC_OK);
<p>　　　　　　　　　　　　response.addHeader(&#8220;Content-Type&#8221;, &#8220;text/plain&#8221;);
<p>　　　　　　　　　　　　response.setEntity(
<p>　　　　　　　　　　　　　　new NStringEntity(&#8220;some important message&#8221;));
<p>　　　　　　　　　　　　　　trigger.submitResponse(response);
<p>　　　　　　　　　　} catch(URISyntaxException ex) {
<p>　　　　　　　　　　trigger.handleException(
<p>　　　　　　　　　　　　new HttpException(&#8220;Invalid request URI: &#8221; +
<p>　　　　　　　　　　　　　　ex.getInput()));
<p>　　　　　　　　　　}
<p>　　　　　　　　}
<p>　　　　　　}.start();
<p>　　}
<p>};</p>
</blockquote>
<p>请注意：<b>HttpResponse</b>对象并非是线程安全的，不能发生同时性修改。非阻塞式请求处理则必须确保<b>HttpResponse</b>不能在同一时刻被多个线程访问。<br />
<h4><font color="#9b00d3">2.8.1.3. 非阻塞式请求处理者解析器</font></h4>
<p>　　非阻塞是HTTP请求处理者的管理和阻塞式HTTP请求处理则很类似。通常是使用<b>NHttpRequestHandlerResolver</b>的实例来维护请求处理者的注册，并且匹配请求URI到一个特定的请求处理者。HttpCore只包括一个非常简单的<b>NHttpRequestHandlerResolver</b>实现，它基于一个简单而琐碎的模式匹配算法：<b>NHttpRequestHandlerRegistry</b>支持三种格式：*, &lt;uri&gt;* 和*&lt;uri&gt;。<br />
<blockquote>
<p>// Initialize asynchronous protocol handler
<p>AsyncNHttpServiceHandler handler;
<p>NHttpRequestHandlerRegistry handlerResolver =
<p>new NHttpRequestHandlerRegistry();
<p>handlerReqistry.register(&#8220;/service/*&#8221;, myRequestHandler1);
<p>handlerReqistry.register(&#8220;*.do&#8221;, myRequestHandler2);
<p>handlerReqistry.register(&#8220;*&#8221;, myRequestHandler3);
<p>handler.setHandlerResolver(handlerResolver);</p>
</blockquote>
<p>鼓励用户提供一个更精致稳健的<b>NHttpRequestHandlerResolver</b>实现，比如基于正则表达式的实现。<br />
<h3><font color="#0000ff">2.8.2. 客户端异步HTTP协议处理</font></h3>
<p>　　<b>AsyncNHttpClientHandler</b>是一个完全异步的客户端HTTP协议处理者，它实现了HTTP协议中客户端消息处理的基本需求(RFC2616)。对特定的HTTP连接而言，<b>AsyncNHttpClientHandler</b>具有在接近常数内存消耗下处理HTTP请求的能力。当使用<b>ConsumingNHttpEntity</b>或<b>ProducingNHttpEntity</b>将消息体的内容直接从消息体流向基础通道(或相反方向)时，这个处理者在内存中保存了HTTP消息头。
<p>　　当使用这个实现时，必须保证消息体支持实现了<b>ProducingNHttpEntity</b>的写。这样做将允许消息体进行异步写。如果消息体所支持的写没有实现<b>ProducingNHttpEntity</b>接口，那么一个委托会被添加：全部的内容会缓存在内存中。此外，这个缓存动作可能会发生在I/O调度线程中，可能会导致I/O暂时性阻塞。最好是，确保<b>NHttpRequestExecutionHandler</b>中，在HTTP请求中设置的所有的消息体都实现了<b>ProducingNHttpEntity</b> 接口。
<p>　　如果进站响应附带有消息体,<b> NHttpRequestExecutionHandler</b>接口期望返回一个<b>ConsumingNHttpEntity</b>,便于读取内容。在消息体完成数据读后，NHttpRequestExecutionHandler#handleResponse()会被调用处理响应。
<p><b></b>
<p>　　<b>AsyncNHttpClientHandler</b>依赖于<b>HttpProcessor</b>对出站消息生成的消息头，以及对所有进站/出站消息进行一般，交叉的消息转换，然而个别的HTTP请求处理者还被期望能够照顾到特定内容的生成和处理。<br />
<blockquote>
<p>// Initialize HTTP parameters
<p>HttpParams params;
<p>//Initialize HTTP processor
<p>HttpProcessor httpproc;
<p>//Create HTTP request execution handler
<p>NHttpRequestExecutionHandler execHandler;
<p>AsyncNHttpClientHandler handler = new AsyncNHttpClientHandler(
<p>　　　　　　httpproc,
<p>　　　　　　execHandler,
<p>　　　　　　new DefaultConnectionReuseStrategy(),
<p>　　　　　　params);</p>
</blockquote>
<h4><font color="#9b00d3">2.8.2.1. 异步HTTP请求执行处理者</font></h4>
<p>　　<b>异步HTTP</b><b>请求执行处理者</b>被当作客户端的<b>协议处理者</b>，用来触发新的HTTP请求的提交和HTTP响应的处理。
<p>HTTP请求执行事件定义在<b>NHttpRequestExecutionHandler</b>接口中：
<p>　　•initalizeContext: 当一个新的连接成功建立并且HTTP上下文初始化完毕时触发。这个方法的第二个参数(一个附件对象)就是ConnectingIOReactor#connect()第三个参数对应的附件对象。这个可能存在的附件对象可能包含一些为了正确初始化HTTP上下文所需要的状态信息。
<p>　　•submitRequest: 当基础连接已经准备好发送一个新的HTTP请求到目标主机时触发。如果客户端还没有准备好发送一个请求时，这个方法可能会返回一个null。在这种情况下，连接将保持打开并且稍后能被激活。如果请求包含消息体，那么这个消息体必须是一个<b>ProducingNHttpEntity</b>实例。
<p>　　•responseEntity: 当含消息体的响应已经被接受时触发。这个方法应该返回一个<b>ConsumingNHttpEntity</b>(一个可消费的消息体)。响应值能为null,这表示消息体应该被忽略。在消息体完全被消费后，handleResponse方法会被调用来通知完整的含消息体的响应已经准备好被处理。
<p>　　•handleResponse: 当HTTP响应已经准备好被处理时触发。
<p>　　•finalizeContext: 当连接被终止时触发。这个事件能被用来释放已经存储在上下文的对象或执行其他的一些清理工作。<br />
<blockquote>
<p>NHttpRequestExecutionHandler execHandler =
<p>　　new NHttpRequestExecutionHandler() {
<p>　　　　private final static String DONE_FLAG = &#8220;done&#8221;;
<p>　　　　public void initalizeContext(
<p>　　　　　　HttpContext context,
<p>　　　　　　Object attachment) {
<p>　　　　　　　　if (attachment != null) {
<p>　　　　　　　　　　HttpHost virtualHost = (HttpHost) attachment;
<p>　　　　　　　　　　context.setAttribute(ExecutionContext.HTTP_TARGET_HOST,
<p>　　　　　　　　　　　　virtualHost);
<p>　　　　　　　　}
<p>　　　　}
<p>　　　　public void finalizeContext(HttpContext context) {
<p>　　　　　　context.removeAttribute(DONE_FLAG);
<p>　　　　}
<p>　　　　public HttpRequest submitRequest(HttpContext context) {
<p>　　　　　　// Submit HTTP GET once
<p>　　　　　　Object done = context.getAttribute(DONE_FLAG);
<p>　　　　　　if (done == null) {
<p>　　　　　　　　context.setAttribute(DONE_FLAG, Boolean.TRUE);
<p>　　　　　　　　return new BasicHttpRequest(&#8220;GET&#8221;, &#8220;/&#8221;);
<p>　　　　　　} else {
<p>　　　　　　　　return null;
<p>　　　　　　}
<p>　　　　}
<p>　　　　public ConsumingNHttpEntity responseEntity(
<p>　　　　　　HttpResponse response,
<p>　　　　　　HttpContext context) throws IOException {
<p>　　　　　　　　// Buffer incoming content in memory for simplicity
<p>　　　　　　　　return new BufferingNHttpEntity(response.getEntity(),
<p>　　　　　　　　　　new HeapByteBufferAllocator());
<p>　　　　}
<p>　　　　public void handleResponse(
<p>　　　　　　HttpResponse response,
<p>　　　　　　HttpContext context) throws IOException {
<p>　　　　　　　　System.out.println(response.getStatusLine());
<p>　　　　　　　　if (response.getEntity() != null) {
<p>　　　　　　　　　　System.out.println(EntityUtils.toString(response.getEntity()));
<p>　　　　}
<p>　　}
<p>};</p>
</blockquote>
<h3><font color="#0000ff">2.8.3. 兼容阻塞式I/O</font></h3>
<p>　　除了上述异步协议处理者，HttpCore还提供了两种HTTP协议处理者，它们在非阻塞上层模拟了阻塞式I/O模型，允许消息内容使用标准的java.io.OutputStream和java.io.InputStream的API进行数据的生产和消费。兼容后的协议处理者能够工作在含阻塞式HttpEntity的HTTP请求处理则和请求执行者环境下。
<p>　　兼容后的协议处理者依赖于<b>HttpProcessor</b>对出站消息生成的消息头，以及对所有进站/出站消息进行一般的，交叉的消息转换，然而个别的HTTP请求执行者/处理者还被期望能够照顾到特定内容的生成和处理。<br />
<h4><font color="#9b00d3">2.8.3.1. 缓冲式协议处理者</font></h4>
<p>　　<b>BufferingHttpServiceHandler</b>和<b>BufferingHttpClientHandler</b>就是实现了兼容阻塞式I/O模型并将HTTP消息完整内容都存储在内存中的协议处理者。请求/响应回调处理只在当完整消息内容都被读到内存缓冲器中才激活。请注意：请求执行/请求处理会占用主I/O线程，所以个别请求执行者/请求处理者必须确保他们不会无限期阻塞。
<p>　　缓冲式协议处理者应该只能用在长度有限的HTTP消息交换的情况下。<br />
<h4><font color="#9b00d3">2.8.3.2. 流控式协议处理者</font></h4>
<p>　　<b>ThrottlingHttpServiceHandler</b>和<b>ThrottlingHttpClientHandler</b>就是实现了兼容阻塞式I/O模型的另两个协议处理者，他们利用共享的内容缓冲器和一个小型的工作者线程池。这个流控式协议处理者初始化时分配了固定长度的输入/输出缓冲器,并且控制I/O事件的速率，目的是确保这些缓冲器不会溢流。这些有助于在内容流进和流出条件下，HTTP连接能保持接近常数内存，也避免了内存溢出。请求/响应的回调处理将在消息已被接受的时候立刻激活。流控制式协议处理者委托请求处理/生成响应的任务给执行者，这些执行者被期望使用工作者线程执行这些任务，从而避开阻塞I/O线程的可能。
<p>　　通常流控式协议处理者只需要适当数量的工作者线程，大大小于并发连接数。如果消息的长度较小或者有一个恰当尺寸的共享的内容缓冲器，那么的工作者线程正好将内容存储在缓冲器中后立刻中止，而不会阻塞。I/O调度线程将专注于将已经缓存的内容异步向外发送。工作者线程将在处理大消息或共享缓冲器被填满时阻塞。对性能优化而言，依据内容体的平均尺寸来分配共享缓冲器的做法是明智的。<br />
<h3><font color="#0000ff">2.8.4. 连接事件听众</font></h3>
<p>　　和HTTPCore其它类类似，协议处理者没有记录日志，目的是不强制用户对日志框架的选择。然后可以通过注入一个<b>EventListener</b>的实例到协议处理者中，可以记录重要的连接事件日志。
<p>定义在<b>EventListener</b>接口中的连接事件：
<p>　　•fatalIOException: 当一个I/O错误导致连接终止时触发。
<p>　　•fatalProtocolException: 当HTTP协议错误导致连接终止时触发。
<p>　　•connectionOpen: 当一个新的连接建立时触发。
<p>　　•connectionClosed: 当连接被终止时触发。
<p>　　• connectionTimeout: 当连接超时触发。<br />
<h2>2.9. 非阻塞式TLS/SSL</h2>
<h3><font color="#0000ff">2.9.1. SSL I/O会话</font></h3>
<p><b>SSLIOSession</b>是一个装饰者类，目的是通过继承<b>IOSession</b>来实现基于SSL/TLS协议的安全层传输能力。一个现有的协议处理者应该能够和SSL会话一起工作，而不需要前置条件或修改。然而I/O调度器则需要添加一些动作，以确保正确的安全层传输功能。
<p>　　• 当基础I/O会话已经建立时，I/O调度者必须调用SSLIOSession#bind()方法，目的是使SSL会话进入客户端或服务端模式。
<p>　　• 当基础I/O会话准备输入时，I/O调度者应该通过调用SSLIOSession#isAppInputReady()来检查SSL I/O会话是否准备好输入数据生产，通过对协议处理者的控制，最终会调用SSLIOSession#inboundTransport()方法，目的是做必须做的SSL握手和输入数据解密。
<p>　　• 当基础I/O会话准备输出，I/O调度者应该通过调用SSLIOSession#isAppOutputReady()来检查SSL I/O会话是否准备好输出数据的接受，通过对协议处理这的控制，最终会调用SSLIOSession#outboundTransport()方法，目的是做必须做的SSL握手和应用数据的加密。<br />
<h4><font color="#9b00d3">2.9.1.1. SSL I/O会话处理者</font></h4>
<p>通过定制<b>SSLIOSessionHandler</b>接口的实现，可以自定义TLS/SSL协议的各个方面。<b>SSLIOSessionHandler</b>接口中定义SSL事件：
<p>　　•initalize: 当SSL连接已经初始化时触发。这个处理者可以用这个回调函数来定制javax.net.ssl.SSLEngine属性，目的是建立SSL会话。
<p>　　•verify: 当SSL连接已经建立并且SSL握手已经成功完成时触发。这个处理者能用这个回调函数来验证SSL会话的属性。作为一个实例，应该能正确地强制SSL密码强度，并且验证证书链和主机检查。<br />
<blockquote>
<p>// Get hold of new I/O session
<p>IOSession iosession;
<p>// Initialize default SSL context
<p>SSLContext sslcontext = SSLContext.getInstance(&#8220;SSL&#8221;);
<p>sslcontext.init(null, null, null);
<p>SSLIOSession sslsession = new SSLIOSession(
<p>　　　　iosession, sslcontext, new SSLIOSessionHandler() {
<p>　　public void initalize(
<p>　　　　　　SSLEngine sslengine,
<p>　　　　　　HttpParams params) throws SSLException {
<p>　　　　// Ask clients to authenticate
<p>　　　　sslengine.setWantClientAuth(true);
<p>　　　　// Enforce strong ciphers
<p>　　　　sslengine.setEnabledCipherSuites(new String[] {
<p>　　　　　　&#8221;TLS_RSA_WITH_AES_256_CBC_SHA&#8221;,
<p>　　　　　　&#8221;TLS_DHE_RSA_WITH_AES_256_CBC_SHA&#8221;,
<p>　　　　　　&#8221;TLS_DHE_DSS_WITH_AES_256_CBC_SHA&#8221; });
<p>　　}
<p>　　public void verify(
<p>　　　　SocketAddress remoteAddress,
<p>　　　　SSLSession session) throws SSLException {
<p>　　　　X509Certificate[] certs = session.getPeerCertificateChain();
<p>　　　　// Examine peer certificate chain
<p>　　　　for (X509Certificate cert: certs) {
<p>　　　　　　System.out.println(cert.toString());
<p>　　　　}
<p>　　}
<p>});</p>
</blockquote>
<h3><font color="#0000ff">2.9.2. SSL I/O事件调度器</font></h3>
<p>　　HttpCore提供了<b>SSLClientIOEventDispatch</b>和<b>SSLServerIOEventDispatch</b>的I/O调度者的实现。这些调度者所有必须的动作封装了活动I/O会话，这是一个SSL I/O会话的装饰者，并且确保能够正确地处理SSL协议握手。</p>
<p style='text-align:left'>&copy; 2012, <a href='http://blog.chaoskey.com'>無處不在</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chaoskey.com/2012/02/19/201202200934/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在GAE平台上将任务提交给后台实例运行的范例</title>
		<link>http://blog.chaoskey.com/2011/11/14/201111151449</link>
		<comments>http://blog.chaoskey.com/2011/11/14/201111151449#comments</comments>
		<pubDate>Tue, 15 Nov 2011 06:51:24 +0000</pubDate>
		<dc:creator>混沌</dc:creator>
				<category><![CDATA[技术地带]]></category>
		<category><![CDATA[backend]]></category>
		<category><![CDATA[gae]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[网页代理]]></category>
		<category><![CDATA[范例]]></category>

		<guid isPermaLink="false">http://blog.chaoskey.com/2011/11/14/201111151449</guid>
		<description><![CDATA[&#160;&#160;&#160;&#160;&#160;&#160; 上一篇博文提到：由于GAE的免费配额大幅缩水，导致在GAE上运行一个完整的Blog程序必然超配额而终止运行。如果启用了计费，又太贵（在访问量不大的情况下居然每天至少要0.7美元）。于是我仅在GAE上运行一个简单的网页代理程序，直接抓取部署在新浪云计算平台上的二级域名博客程序的内容，显示在独立域名下（并且在GAE上缓存该内容）。 &#160;&#160;&#160;&#160;&#160;&#160; 本文的目标就是进一步充分利用GAE后台实例(Frontend Instance)的免费配额资源。就是尽可能地将运行在前台实例(Frontend Instance)上的一部分任务分摊到后台实例(Backend Instance)上运行。本文的另外一个目标就是提供一个如何应用GAE后台实例的范例。 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 我们按GAE平台上urlfetch.fetch(&#8230;)抓取一次目标页面所耗时分成两类：１）能在5秒中以内抓取成功的任务&#160; 2)５秒中以内无法成功抓取的任务(抛DeadlineExceededError异常)。如果是前者很自然是在前台实例上运行，然后将抓取成功的目标页面内容缓存后输出到页面。（这就是上一篇博文所附网页代理程序的核心流程） &#160;&#160;&#160;&#160;&#160;&#160; 如果是后者，则首先提交给任务队列后，然后直接重定向到目标页面（这部分计算还是运行在前台实例上）： # 可能是在5秒钟限制下失败的页面读取请求，将其抛入队列等待处理 taskqueue.add(url=&#8217;/refetchtask&#8217;, params={&#8216;key&#8217;: key_name,&#8217;value&#8217;: mirrored_url}) # 重定向到目标页面(结束) logging.debug(&#34;Redirect &#8216;%s&#8217;&#34;,mirrored_url) self.response.set_status(302) return self.redirect(mirrored_url) &#160;&#160;&#160;&#160;&#160;&#160; 上述进入队列的任务出列后，优先提交给后台实例运行(注：这个任务提交过程本身是运行在前台实例上的)： try: &#160;&#160;&#160;&#160;&#160;&#160; # 优先交给后台实例处理 &#160;&#160;&#160;&#160;&#160;&#160; backend_url = backends.get_url(BACKEND_NAME)+&#8217;/_ah/start&#8217; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; logging.debug(&#34;backend_url &#8216;%s?key=%s&#38;value=%s&#8217;&#34;,backend_url,key_name,mirrored_url) &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; form_fields = { &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#34;key&#34;: key_name, &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#34;value&#34;: mirrored_url &#160;&#160;&#160;&#160;&#160;&#160; } &#160;&#160;&#160;&#160;&#160;&#160; form_data = urllib.urlencode(form_fields)&#160; &#160;&#160;&#160;&#160;&#160;&#160; [...]]]></description>
			<content:encoded><![CDATA[<p>&#160;&#160;&#160;&#160;&#160;&#160; 上一篇博文提到：由于GAE的免费配额大幅缩水，导致在GAE上运行一个完整的Blog程序必然超配额而终止运行。如果启用了计费，又太贵（在访问量不大的情况下居然每天至少要0.7美元）。于是我仅在GAE上运行一个简单的网页代理程序，直接抓取部署在新浪云计算平台上的二级域名博客程序的内容，显示在独立域名下（并且在GAE上缓存该内容）。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160; 本文的目标就是进一步充分利用GAE<strong><span style="color: #ff0000">后台实例</span></strong>(Frontend Instance)的免费配额资源。就是尽可能地将运行在<span style="color: #ff0000"><strong>前台实例</strong></span>(Frontend Instance)上的一部分任务分摊到<span style="color: #ff0000"><strong>后台实例</strong></span>(Backend Instance)上运行。本文的<strong><span style="color: #0000ff">另外一个目标就是提供一个如何应用GAE后台实例的范例</span></strong>。</p>
<p><span id="more-1282650"></span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 我们按GAE平台上urlfetch.fetch(&#8230;)抓取一次目标页面所耗时分成两类：１）能在5秒中以内抓取成功的任务&#160; 2)５秒中以内无法成功抓取的任务(抛DeadlineExceededError异常)。如果是前者很自然是在<strong><span style="color: #ff0000">前台实例</span></strong>上运行，然后将抓取成功的目标页面内容缓存后输出到页面。（这就是上一篇博文所附网页代理程序的核心流程）
<p>&#160;&#160;&#160;&#160;&#160;&#160; 如果是后者，则首先提交给任务队列后，然后直接重定向到目标页面（这部分计算还是运行在<strong><span style="color: #ff0000">前台实例</span></strong>上）：</p>
<blockquote><p># 可能是在5秒钟限制下失败的页面读取请求，将其抛入队列等待处理      <br />taskqueue.add(url=&#8217;/refetchtask&#8217;, params={&#8216;key&#8217;: key_name,&#8217;value&#8217;: mirrored_url})       <br /># 重定向到目标页面(结束)       <br />logging.debug(&quot;Redirect &#8216;%s&#8217;&quot;,mirrored_url)       <br />self.response.set_status(302)       <br />return self.redirect(mirrored_url)</p>
</blockquote>
<p>&#160;&#160;&#160;&#160;&#160;&#160; 上述进入队列的任务出列后，优先提交给<strong><span style="color: #ff0000">后台实例</span></strong>运行(注：这个任务提交过程本身是运行在<strong><span style="color: #ff0000">前台实例</span></strong>上的)：</p>
<blockquote><p>try:      <br />&#160;&#160;&#160;&#160;&#160;&#160; # 优先交给后台实例处理       <br />&#160;&#160;&#160;&#160;&#160;&#160; backend_url = <strong><span style="color: #ff0000">backends.get_url</span></strong>(BACKEND_NAME)+&#8217;/_ah/start&#8217;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; logging.debug(&quot;backend_url &#8216;%s?key=%s&amp;value=%s&#8217;&quot;,backend_url,key_name,mirrored_url)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; form_fields = {       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;key&quot;: key_name,       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;value&quot;: mirrored_url       <br />&#160;&#160;&#160;&#160;&#160;&#160; }       <br />&#160;&#160;&#160;&#160;&#160;&#160; form_data = urllib.urlencode(form_fields)&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160; result = <strong><span style="color: #ff0000">urlfetch.fetch</span></strong>(backend_url,       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; payload=form_data,       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; method=urlfetch.POST,       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; headers={&#8216;Content-Type&#8217;: &#8216;application/x-www-form-urlencoded&#8217;})       <br />&#160;&#160;&#160;&#160;&#160;&#160; self.response.headers['Content-Type'] = &#8216;text/plain&#8217;       <br />&#160;&#160;&#160;&#160;&#160;&#160; self.response.out.write(result.content)       <br />except (urlfetch.Error, apiproxy_errors.Error):       <br />&#8230;&#8230;</p>
</blockquote>
<p>&#160;&#160;&#160;&#160;&#160;&#160; 如果<strong><span style="color: #ff0000">后台实例</span></strong>也无法运行时(很可能是超配额，因为<strong><span style="color: #ff0000">后台实例</span></strong>的免费配额比<strong><span style="color: #ff0000">前台实例</span></strong>的免费配额还更少)，转而将任务按60秒超时重新在<strong><span style="color: #ff0000">前台实例</span></strong>(就是当前流程中)上运行网页抓取任务:</p>
<blockquote><p>&#160;&#160;&#160; &#8230;&#8230;      <br />except (urlfetch.Error, apiproxy_errors.Error):       <br />&#160;&#160;&#160;&#160;&#160;&#160; # 超配额则按６０秒的限制重新抓取目标页面       <br />&#160;&#160;&#160;&#160;&#160;&#160; logging.debug(&quot;Try refetching &#8216;%s&#8217;&quot;,mirrored_url)       <br />&#160;&#160;&#160;&#160;&#160;&#160; content = MirroredContent.<span style="color: #ff0000"><strong>fetch_and_cache</strong></span>(key_name,mirrored_url,timeout=60)       <br />&#160;&#160;&#160;&#160;&#160;&#160; self.response.headers['Content-Type'] = &#8216;text/plain&#8217;       <br />&#160;&#160;&#160;&#160;&#160;&#160; if content :       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; self.response.out.write(&#8216;successful&#8217;)       <br />&#160;&#160;&#160;&#160;&#160;&#160; else :       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; self.response.out.write(&#8216;unsuccessful&#8217;)</p>
</blockquote>
<hr />
<p>&#160;&#160;&#160;&#160;&#160;&#160; 下面才是本文的重点（后台实例的部署,为了使前面“提交后台实例运行：向一个特殊的URL发起的一个HTTP请求”的动作能正常执行） ：</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160; 1)首先，要在backends.yaml中配置后台实例，(命名为fetch_backend,配置最小内存,一个后台实例，由HTTP请求驱动的动态启动方式)：</p>
<blockquote><p>backends:      <br />- name: <strong><span style="color: #ff0000">fetchbackend</span></strong>       <br />&#160;&#160;&#160;&#160;&#160;&#160; class: B1       <br />&#160;&#160;&#160;&#160;&#160;&#160; instances: 1       <br />&#160;&#160;&#160;&#160;&#160;&#160; options: dynamic</p>
</blockquote>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 后台实例需要单独部署的，部署命令：</p>
<blockquote><p>appcfg backends webproxy/ update</p>
</blockquote>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 后台实例有一个形如单独的网址：<code>[instance].[backend].[app].appspot.com 可由API：backends.get_url(BACKEND_NAME)获取，<strong><span style="color: #ff0000">动态启动后台实例的过程就是向这个网址＋请求路径（比如：/_ah/start）发起一个可以带参数的HTTP请求。</span></strong></code></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160; 2)其次，要在app.yaml中配置处理后台实例启动的HTTP请求路径“/_ah/start”：</p>
<blockquote><p>．．．      <br />handlers:       <br />．．．       <br />- url: <strong><span style="color: #ff0000">/_ah/start</span></strong>       <br />&#160;&#160;&#160;&#160;&#160;&#160; script: webproxy.py       <br />&#160;&#160;&#160;&#160;&#160;&#160; login: admin       <br />．．．</p>
</blockquote>
<p>&#160;&#160;&#160;&#160;&#160;&#160; 3)最后，对上例而言，就是在webproxy.py中编写/_ah/start响应代码（这部分代码才是真正运行在<strong><span style="color: #ff0000">后台实例</span></strong>上的）：</p>
<blockquote><p>class <span style="color: #ff0000"><strong>FetchBackend</strong></span>(webapp.RequestHandler):&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160; def get(self):&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; self.response.headers['Content-Type'] = &#8216;text/plain&#8217;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; self.response.out.write(&#8216;Finish&#8217;)</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160; def post(self):      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; key_name = self.request.get(&#8216;key&#8217;)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; mirrored_url = self.request.get(&#8216;value&#8217;)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if not MirroredContent.get_by_key_name(key_name):       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; MirroredContent.fetch_and_cache(key_name,mirrored_url,timeout=120)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; self.response.headers['Content-Type'] = &#8216;text/plain&#8217;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; self.response.out.write(&#8216;Finish&#8217;)</p>
<p>&#8230;&#8230;      <br />application = webapp.WSGIApplication([('/refetchtask',ReFetchTask),&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong><span style="color: #ff0000">('/_ah/start',FetchBackend)</span></strong>,       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ('(/.*)/?', WebProxy)],&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; debug=True)</p>
</blockquote>
<p>&#160;&#160;&#160;&#160;&#160;&#160; 最后说明：作为GAE<strong><span style="color: #0000ff">后台实例</span></strong>使用范例的目的算是完成了。至于是否能有效地减少<strong><span style="color: #0000ff">前台实例</span></strong>的计算时间，分摊一部分计算任务给<strong><span style="color: #0000ff">后台实例</span></strong>，有待运行数据的验证。</p>
<p>【２０１１－１１－１９补记】</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160; 经过一段时间的运行，发现GAE<strong><font color="#0000ff">后台实例</font></strong>根本不适合单个小任务的运行，因为启动一个<strong><font color="#0000ff">后台实例</font></strong>的耗时远远大于直接抓取页面的耗时。它适合于长时间的批量的数据处理。于是做了些改进：     <br />&#160;&#160;&#160;&#160;&#160; 1) 利用GAE－Cron－Jobs定时在凌晨１点启动<strong><font color="#0000ff">后台实例</font></strong>， 在<strong><font color="#0000ff">后台实例</font></strong>上首先抓取网站地图sitemap.xml,根据网站地图逐个抓取目标网页并缓存之。     <br />&#160;&#160;&#160;&#160;&#160; 2)由于缓存数据是不可靠的很可能会失效，为此再次利用GAE－Cron－Jobs每１０分钟对存在的缓存数据进行维持(在<strong><font color="#0000ff">前台实例</font></strong>上运行)，减少缓存数据失效的可能性。    <br />&#160;&#160;&#160;&#160;&#160; 3)拦截用户评论动作，删除对应评论页面的缓存数据。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160; 如此改进后博客访问速度大增，<strong><font color="#ff0000">前台实例</font></strong>每天消耗的计算时间稳定在25Instance Hours上下(免费配额是28),因为用户的请求几乎都是从缓存中读取数据；<strong><font color="#ff0000">后台实例</font></strong>每天消耗的计算时间稳定在１Instance Hours上下(免费配额是9)，因为批量抓取网页的过程耗时在一个小时左右。</p>
<p align="center"><img alt="江一燕古典青花瓷写真" align="middle" src="http://u.chaoskey.com/tu000035-001" width="600" /></p>
<p style='text-align:left'>&copy; 2011, <a href='http://blog.chaoskey.com'>無處不在</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chaoskey.com/2011/11/14/201111151449/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>挂GAE羊头卖SinaApp的狗肉</title>
		<link>http://blog.chaoskey.com/2011/11/11/201111112016</link>
		<comments>http://blog.chaoskey.com/2011/11/11/201111112016#comments</comments>
		<pubDate>Fri, 11 Nov 2011 12:25:42 +0000</pubDate>
		<dc:creator>混沌</dc:creator>
				<category><![CDATA[技术地带]]></category>
		<category><![CDATA[gae]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[sinaapp]]></category>
		<category><![CDATA[云计算]]></category>
		<category><![CDATA[域名备案]]></category>
		<category><![CDATA[网页代理]]></category>

		<guid isPermaLink="false">http://chaoskey.sinaapp.com/2011/11/11/201111112016</guid>
		<description><![CDATA[&#160;&#160;&#160;&#160; Google App Engine免费配额大幅缩水导致使用GAE已经不便宜了。 想转到Sina云计算下搭建wordpress，可在国内绑定域名需要域名备案，而个人域名备案是众所周知的麻烦，特别是Sina云计算平台目前还不支持协助用户进行域名备案。 于是我想到了一个“挂GAE羊头卖SinaApp的狗肉”的方案。 &#160;&#160;&#160;&#160; 对应本博客(http://blog.chaoskey.com)的具体部署过程如下： &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; １）将原部署在GAE的博客程序micolog数据，导出成wordpress格式 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ２）在SinaApp上搭建wordpress, 将上导出的数据导入到wordpress &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ３）在GAE上部署一个类似于网页代理的程序（支持缓存,后附代码），基本思路： &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; *首先试图读取GAE预先存储的缓存页面数据 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; *如果没有缓存数据，则试图到SinaApp博客页面抓取页面内容，抓取成功后存入GAE缓存(缓存24小时后失效,因为GAE平台的免费配额是按天分配的) &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; *如果抓取SinaApp博客页面内容失败，则直接重定向到SinaApp博客页面。 &#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160; 之所以采用上述“挂GAE羊头卖SinaApp的狗肉”的方案，是因为： &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; １）对于这个GAE网页代理程序而言，GAE免费配额还是足够用的。（如果博客程序完全部署在GAE上必然超免费配额，对我的博客而言每天至少要0.6美元，太贵了。） &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ２）SinaApp云计算平台的收费相对GAE还是很便宜的，对于我的博客而言每天估计只需要0.5人民币。 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ３）GAE支持域名绑定自然也不需要备案。SinaApp云计算平台绑定域名需要预先域名备案，但又不协助用户进行域名备案。 &#160;&#160;&#160;&#160; 按我的方案可是算是两全其美了 ：） &#160;&#160;&#160;&#160; 附GAE网页代理程序关键代码供参考： # -*- coding: utf-8 -*- __author__ = &#8216;混沌 (youliang@chaoskey.com)&#8217; import logging import urllib import hashlib import re from google.appengine.ext import [...]]]></description>
			<content:encoded><![CDATA[<p>&#160;&#160;&#160;&#160; Google App Engine免费配额大幅缩水导致使用GAE已经不便宜了。 想转到Sina云计算下搭建wordpress，可在国内绑定域名需要域名备案，而个人域名备案是众所周知的麻烦，特别是Sina云计算平台目前还不支持协助用户进行域名备案。 于是我想到了一个“挂GAE羊头卖SinaApp的狗肉”的方案。</p>
<p><span id="more-1282618"></span>
<p>&#160;&#160;&#160;&#160; 对应本博客(<a href="http://blog.chaoskey.com">http://blog.chaoskey.com</a>)的具体部署过程如下： </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; １）将原部署在GAE的博客程序micolog数据，导出成wordpress格式    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ２）在SinaApp上搭建wordpress, 将上导出的数据导入到wordpress     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ３）在GAE上部署一个类似于网页代理的程序（支持缓存,后附代码），基本思路：     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; *首先试图读取GAE预先存储的缓存页面数据     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; *如果没有缓存数据，则试图到SinaApp博客页面抓取页面内容，抓取成功后存入GAE缓存(缓存24小时后失效,因为GAE平台的免费配额是按天分配的)     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; *如果抓取SinaApp博客页面内容失败，则直接重定向到SinaApp博客页面。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160; 之所以采用上述“挂GAE羊头卖SinaApp的狗肉”的方案，是因为：</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; １）对于这个GAE网页代理程序而言，GAE免费配额还是足够用的。（如果博客程序完全部署在GAE上必然超免费配额，对我的博客而言每天至少要0.6美元，太贵了。）    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ２）SinaApp云计算平台的收费相对GAE还是很便宜的，对于我的博客而言每天估计只需要0.5人民币。     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ３）GAE支持域名绑定自然也不需要备案。SinaApp云计算平台绑定域名需要预先域名备案，但又不协助用户进行域名备案。</p>
<p>&#160;&#160;&#160;&#160; 按我的方案可是算是两全其美了 ：）</p>
<p>&#160;&#160;&#160;&#160; 附GAE网页代理程序关键代码供参考：</p>
<blockquote><p># -*- coding: utf-8 -*-</p>
<p>__author__ = &#8216;混沌 (youliang@chaoskey.com)&#8217;</p>
<p>import logging      <br />import urllib       <br />import hashlib       <br />import re</p>
<p>from google.appengine.ext import webapp      <br />from google.appengine.ext.webapp.util import run_wsgi_app       <br />from google.appengine.api import memcache       <br />from google.appengine.api import urlfetch       <br />from google.appengine.ext import db       <br />from google.appengine.ext.db import Model       <br />from google.appengine.runtime import apiproxy_errors</p>
<p>DEBUG = False      <br />EXPIRATION_DELTA_SECONDS = 86400       <br />MAX_CONTENT_SIZE = 1000000</p>
<p>IGNORE_HEADERS = frozenset([      <br />&#160; 'set-cookie',       <br />&#160; 'expires',       <br />&#160; 'cache-control',</p>
<p>&#160; # Ignore hop-by-hop headers      <br />&#160; 'connection',       <br />&#160; 'keep-alive',       <br />&#160; 'proxy-authenticate',       <br />&#160; 'proxy-authorization',       <br />&#160; 'te',       <br />&#160; 'trailers',       <br />&#160; 'transfer-encoding',       <br />&#160; 'upgrade',       <br />])</p>
<p>baseUrlMap = {&#8216;blog.chaoskey.com&#8217;:'chaoskey.sinaapp.com&#8217;,      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#8216;www.chaoskey.com&#8217;:'chaoskey.sinaapp.com&#8217;,       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#8216;alerts-bot.appspot.com&#8217;:'chaoskey.sinaapp.com&#8217;,       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#8216;reurl20.alerts-bot.appspot.com&#8217;:'chaoskey.sinaapp.com&#8217;,       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#8216;reurl30.alerts-bot.appspot.com&#8217;:'chaoskey.sinaapp.com&#8217;}       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />reUrlMap = {&#8216;/SITEMAP&#8217;:&#8217;<a href="http://chaoskey-wordpress.stor.sinaapp.com/sitemap.xml'">http://chaoskey-wordpress.stor.sinaapp.com/sitemap.xml&#8217;</a>,       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#8216;/SITEMAP.XML&#8217;:&#8217;<a href="http://chaoskey-wordpress.stor.sinaapp.com/sitemap.xml'}">http://chaoskey-wordpress.stor.sinaapp.com/sitemap.xml&#8217;}</a>       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />class MirroredContent(object):       <br />&#160;&#160;&#160; def __init__(self, status, headers, data):       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; self.status = status       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; self.headers = headers       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; self.data = data       <br />&#160;&#160;&#160; <br />&#160;&#160;&#160; @staticmethod       <br />&#160;&#160;&#160; def get_by_key_name(key_name):       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; return memcache.get(key_name)       <br />&#160;&#160;&#160; <br />&#160;&#160;&#160; @staticmethod       <br />&#160;&#160;&#160; def fetch_and_cache(key_name,mirrored_url):       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; logging.debug(&quot;Fetching &#8216;%s&#8217;&quot;,mirrored_url)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; try:       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; response = urlfetch.fetch(mirrored_url)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; except (urlfetch.Error, apiproxy_errors.Error):       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; logging.exception(&quot;Could not fetch URL&quot;)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return None</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; adjusted_headers = {}      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; for key, value in response.headers.iteritems():       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; adjusted_key = key.lower()       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; if adjusted_key not in IGNORE_HEADERS:       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; adjusted_headers[adjusted_key] = value</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; content = response.content      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; oldurl = &#8216;<a href="http://chaoskey.sinaapp.com'">http://chaoskey.sinaapp.com&#8217;</a>       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; newurl = &#8216;<a href="http://blog.chaoskey.com'">http://blog.chaoskey.com&#8217;</a>       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; pattern = re.compile(oldurl+r&#8217;(/?&quot;|s|/tag|/category|/20|/feed|/sitemap|/robots.txt)&#8217;)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; content = pattern.sub(newurl+r&#8217;1&#8242;, content)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; # If the transformed content is over 1MB, truncate it (yikes!)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; if len(content) &gt; MAX_CONTENT_SIZE:       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; logging.warning(&#8216;Content is over 1MB; truncating&#8217;)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; content = content[:MAX_CONTENT_SIZE]</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; new_content = MirroredContent(      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; status=response.status_code,       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; headers=adjusted_headers,       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; data=content)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; if not memcache.add(key_name, new_content, time=EXPIRATION_DELTA_SECONDS):       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; logging.error(&#8216;memcache.add failed: key_name = &quot;%s&quot;, original_url = &quot;%s&quot;&#8217;, key_name, mirrored_url)       <br />&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; return new_content&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </p>
<p>class ReUrl(webapp.RequestHandler):&#160;&#160;&#160; <br />&#160;&#160;&#160; def get(self,key_name):       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; if key_name is &#8216;/deletememcache&#8217; :       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; memcache.flush_all()       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; self.response.headers['Content-Type'] = &#8216;text/plain&#8217;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return self.response.out.write(&#8216;ok&#8217;)&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; baseUrl=self.request.host_url       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; baseUrl=baseUrl.split(&#8216;://&#8217;)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; newBaseUrl=baseUrlMap.get(baseUrl[1])       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; if not newBaseUrl:       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; self.response.headers['Content-Type'] = &#8216;text/plain&#8217;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return self.response.out.write(&#8216;ok&#8217;)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; newBaseUrl = baseUrl[0].lower()+&quot;://&quot;+newBaseUrl       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; mirrored_url = newBaseUrl       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; if key_name :       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; mirrored_url = reUrlMap.get(key_name.upper())       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if not mirrored_url :       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; mirrored_url = newBaseUrl+key_name       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; content = MirroredContent.get_by_key_name(key_name)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; if content is None:       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; logging.debug(&quot;Cache miss&quot;)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; content = MirroredContent.fetch_and_cache(key_name,mirrored_url)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; if content is None:       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; self.response.set_status(301)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return self.redirect(mirrored_url)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; for key, value in content.headers.iteritems():       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; self.response.headers[key] = value       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; if not DEBUG:       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; self.response.headers['cache-control'] = &#8216;max-age=%d&#8217; % EXPIRATION_DELTA_SECONDS       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; self.response.out.write(content.data)</p>
<p>application = webapp.WSGIApplication([('(/.*)', ReUrl)],      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; debug=True)</p>
<p>def main():      <br />&#160;&#160;&#160; run_wsgi_app(application)</p>
<p>if __name__ == &quot;__main__&quot;:      <br />&#160;&#160;&#160; main()</p>
</blockquote>
<p align="center"><img alt="逼真的铅笔肖像画" align="middle" src="http://u.chaoskey.com/tu000045-009" width="500" /></p>
<p style='text-align:left'>&copy; 2011, <a href='http://blog.chaoskey.com'>無處不在</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chaoskey.com/2011/11/11/201111112016/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

