LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 5049|回复: 24

求定积分有什么好的算法吗?

[复制链接]
发表于 2003-10-26 22:35:55 | 显示全部楼层 |阅读模式
  我想求正态分布函数的反函数,但是又求不出解析式。所有我的想法是,先造一张表,表中是自变量跟函数值的对应关系,然后再利用函数值查表,从而得到自变量。但是造表的过程就是一个求积分的过程,而求精度要求极高,3位有效数字,所以当x < -9 的时候精度就要求达到10^(-20)。
  我现在采用的方法是不停的把积分区间划分得更小,然后把各部分当作矩形,利用面积叠加,求得积分,直到精度达到要求。
  可现在从0还没算到-3(步调是0.01),就花了4个多小时了,而这个精度还只是10^(-5)而已。真不知道算完要多少时间。
发表于 2003-10-27 01:10:57 | 显示全部楼层
最好还是先从数学上找到最好的算法再做
发表于 2003-10-27 01:11:38 | 显示全部楼层
编程重要的不是写代码过程而是思想过程
发表于 2003-10-27 09:48:11 | 显示全部楼层
建议你看看数值分析的课本。中科院的和UIUC的两本都不错,可以去china-pub上搜搜
发表于 2003-10-27 12:12:27 | 显示全部楼层
好想法!
不过概率书一上已经有表了。你查查就是了。
 楼主| 发表于 2003-10-27 13:05:01 | 显示全部楼层
最初由 lordbyorn 发表
好想法!
不过概率书一上已经有表了。你查查就是了。

对,书上有,不过,他的精度远远不够,而且,在我这个程序中,求分布函数,只不过是一个过程而已。其中也要用到迭代,所以,手工查表的方法是行不通的。
发表于 2003-10-28 20:14:40 | 显示全部楼层
Insteresing.
There are some approximations (very good approximation).

If you really want to do this, I may give you some help.
发表于 2003-10-28 20:47:35 | 显示全部楼层
while -1<z<1 you can use this:

y=1/2+1/sqrt(2*pi)*Sum((-1)^n*x^(2n+1)/[(2n+1)*n!*2^n]
where n is from 0 to infinite.

While z<-1 or z>1, I will work it out some day later.:p
I am sure that integral is not needed.
 楼主| 发表于 2003-10-28 21:51:11 | 显示全部楼层
对于 -1<z<1来说,用普通的复化的梯形积分就很容易算出来了,而且速度也不错,我用php编的,也可以在几分钟之内把0~1之间的(0.01为步长)算出来。
但是用这种方法当z<-3.8(7.23e-4)的时候,就不能保证3位有效数字了。最只能保证2位有效数字了,到了z<-3(8.54e-6)的时候就只能保证一位有效数字了。
我怀疑是不是当区间分的太细的时候,X+(delta)x中的(delta)x丢失了导致密度函数就计算不精确,最后就无法达到所需精度。
正在考虑改用c/c++实现,然后用任意精度数学库。
算法也改用Romberg积分,提高收敛速度。
       
lordbyorn:
你的那个级数中的sart这个函数,我没见过。
 楼主| 发表于 2003-10-28 21:54:36 | 显示全部楼层

呵呵

发过才发现你又改过了
我等你的结果,我数学都忘的差不多了
谢谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表