张麟 2010年08月05日 星期四 17:15 | 2767次浏览 | 0条评论
“
分不清从什么时候开始 我已经悄悄爱上你的样子
我愿意化作那古老的树 站在你每天回家的路
历经了多少的风吹雨打 我依然痴痴等着你的回答
每一个月光下美丽的神话 难分辨是真是假
”
不知道什么时候,突然觉得自己老了,对MATLAB是又爱又恨。现在终于找到了python了。正如各种秘籍中所说的,就是他,我等了10年,就为了今天的这个缘分。原来语言也是要缘分的。随着年纪的增大,经济上却没有跟着增长,眼光越发迷离于那些免费的,开源的,东东了。如果您与我同样的窘迫,同样的势利,谁说世上没有免费的午餐。现在,python,就是你的选择。
呵呵,好像无论是谁,想写些经验之谈,都要先给自己所写的东西大加赞扬和推荐一番,我也是凡人当然也无法避免。言归正传,一下本人给出了一个最简单的进入python的方式。
一、编译器
也别管什么OS了,我一直用windows,现在用win7。其他的什么OS我不会。当然得先去下载一个python版本吧。现在我用python2.6。版本之间的差别,2.x内差别不是很大,且向后兼容。3.x和2.x之间的支持就会有些问题,具体可见各种秘籍,我这是开门鞭炮,就是来拉客的。好,打开IE,输入地址: http://www.python.org ,找到download。down一个下来。找一个空间较大的分区安装,ok!假设就在D:/python26 下。
二、开始写程序
点开始菜单---->程序-->python26--->IDLE(python GUI),打开编译窗口,如下图:
看到这个我们成功一半了,下面就是往这个里面写东西。以我15年muz到war3的经历,apm一定是够的。(什么?apm不知道什么意思?你用锤子敲打键盘,每秒敲打的次数就是apm)。当然本人学python的目的在于python(x,y)的使用,也就是数值运算,对什么内存啊,管理啊,什么django,什么Tkiner,什么google APPENGINE,不在乎,也管不了那许多。只要让我能在这玩意上算出东西就好了。
好了,也别什么helloworld,先写个简单的函数吧!
这,还是先介绍一点咋数值计算要用的,def 定义一个函数。
举个例子:
pi这个值,大家知道吧,pi=圆的面积除以半径的平方。
正n边形的面积(外接圆半径为1)为n/2*sin(2*pi/n)。只要n够大,我们的pi就够精确。这里pi近似等于内接正n边形面积。
一下为代码:
>>> import math
>>> def pivalue(n):
return n/2*math.sin(2*math.pi/n)
第一句,有一个import ,是为了加载math模块,math模块里定义了各种数学函数与实现。可以使用dir(math)来查看相关信息。这样添加了模块math后,就可以像math.sin(x)这样使用sin函数。看起来是不是很简单。
这个先放在一边,有人会问,你这什么程序,你用pi的值来计算pi的值,哪有这样的啊。呵呵,我知道错了,那我现在先假设我们有办法来计算外接正多边形的面积了好吧,但是精度一定不会比我们这个算法高。
运行一个值看看,
>>> pivalue(10)
2.9389262614623659
好像精度不行啊。我们换一种方式来 ,刚计算的是外接圆的面积,那这次我们用内切圆看看。内切圆面积(半径1)用外切正n边形面积近似。
外切正n边形面积:n*tan(pi/n).
这些都可以从sin(x)~x, 及tan(x)~x 看出。
同样我们也写一个pivalue1程序。为了方便我们建立一个模块,或者说新建一个.py文件,类似于MATLAB众的m文件。如下:
# -*- coding: cp936 -*-
#给出pi计算方式。
from math import * #引用math模块
def pivalue1(n):
return n/2*sin(2*pi/n)
def pivalue2(n):
return n*tan(pi/n)
这些代码很简单,保存在pivaluetest.py文件中。这里可以理解一下import一句使用与表达方式的不同,直接import math 则在以后使用其中的函数时必须要math.XX().而from math import *,则可以直接使用,具体有优有弊,
我们推荐使用比如我们要用sin函数,我们可以这样申明:
from math import sin
同样我们也计算一下n=10时的值。在文件后面追加下列代码:
print pivalue1(10),pivalue2(10)
结果是:
2.93892626146 3.24919696233
发现pivalue1(10)的精度比pivalue2(10) 的精度差不多。
以下我们介绍一种外推方法可以得到相当高的精度。
三、组合方法与函数调用
其实作为数值计算来说,前面的基本应用已经可以让我们可以入门写一些东西了。再加上一些控制语句,及算法思想,就可以写出各种复杂程度的程序。为了我们的可视化需求,也许我们还要需要写一些基于界面的编程。这里我不做深入的讨论。现在我们希望我们能借助最少的语法上的知识,来对python有一定的理解。
我们继续上面的pi的计算。虽然我们写了两个函数,每个函数都可以计算出pi的近似值,(我们在计算内接多边形与外切多边形上,使用了pi的值,但是这里不影响我们在讨论外推技术上的理解。使用pi的目的不过是让我们更容易的去使用代码来计算多边形的面积,如果使用其他的代数方法,则会有喧宾夺主之嫌。
红色部分,是外切多边形。即是pivalue2(n)的值。而蓝色的是pivalue1(n)的值。他们的关系式:
pivalue1(n)= n/2*sin(2*pi/n) 和pivalue2(n)=n*tan(pi/n)
考察第一个公式,记h=1/n.
记:S(n)=1/(h*2)*sin(2*pi*h)
在0点展开,S(n)=1/(2*h)*[2*pi*h-(2*pi*h)^3/3!+O(h^5)]=pi-pi^3*(2*h)^2/3!+O(h4)
同样记:Q(n)=1/h*tan(h*pi)=pi+pi^3*h^2/3+O(h4)
连列这两个等式,解出
pi=1/3*(S(n)+2Q(n))+O(h4)
在代码后面加上如下代码:
print (pivalue1(10)+2*pivalue2(10))/3
得出结果
3.14577339537 。
在回想一下我们的pivalue1(10)和pivalue2(10)的值: 2.93892626146 3.24919696233。 这两个数字误差在0.2,即10的-1次方。
而组合后的结果是(-3)次方的精度。而,组合前的函数,到n=100才能达到这个精度。
若想要计算出3.1415926的精度,则需要n=26000。
组合时,n=200就足够。追加以下代码:
print (pivalue1(200)+2*pivalue2(200))/3
print pivalue1(26000),pivalue2(2600)
结果为:
3.14159267909
3.14159262301 3.1415941825
。
由此,我们可以看到组合方法在数值计算中的优势。
四、外推
在回顾我们刚才的公式:
pi=1/3*(S(n)+2Q(n))-O(h4)
pi<1/3*(S(n)+2Q(n)).
也就是知道pi的上限。同样我们可以知道pi的下限。
再把那两个展开式拿下来:
由此我们可知道
S(n)=pi-pi^3*(2*h)^2/3!+O(h4)
Q(n)=pi+pi^3*h^2/3+O(h4)
其实Sn就是下限,但是这个上限太难计算了。我们仍然希望通过组合方式可以得到。
计算(4*Q(2n)-Q(n))/3可知:
(4*Q(2n)-Q(n))/3=pi-O(h^4)
所以pi>(4*Q(2n)-Q(n))/3
修改代码:(最终代码为:)
# -*- coding: cp936 -*-
#给出pi计算方式,pivaluetest.py
from math import * #引用math模块
def pivalue1(n):
return n/2*sin(2*pi/n)
def pivalue2(n):
return n*tan(pi/n)
print 4*pivalue2(2*200)/3-pivalue2(200)/3,'<' ,'pi','<',(pivalue1(200)+2*pivalue2(200))/3
print pivalue1(26000),pivalue2(26000)
计算结果:
>>>
3.14159264721 < pi < 3.14159267909
3.14159262301 3.14159266888
>>>
五、结束语
以上是以个python计算的例子。使用python写程序做计算比较方便,即使是那些具有较多的矩阵运算的PDE的求解也会和matlab一样的方便。困难只会处在对算法本身的理解上。
最后仍然要推荐那本《用python做科学计算》,确实是非常不错的书,尤其是书中给出了非常多的数值计算与图形处理等的软件包。并且也给了很详细的解释。非常不错。强强强烈推荐。
Zeuux © 2024
京ICP备05028076号
暂时没有评论