wolfram-mathematica - Maxima 在相对简单的积分上崩溃

标签 wolfram-mathematica maxima

我正在尝试使用 Maxima-fy 我的 Mathematica 框选项公式
(https://github.com/barrycarter/bcapps/blob/master/box-option-value.m)
但是 Maxima 在一个相当简单的集成时崩溃了:

load(distrib); 
pdflp(x, p0, v, p1, p2, t1, t2) := pdf_normal(x,log(p0),sqrt(t1)*v); 
cdfmaxlp(x, p0, v, p1, p2, t1, t2) := 1-erf(x/(v*sqrt(t2-t1)/sqrt(2))); 

upandin(p0, v, p1, p2, t1, t2) :=  
 integrate( 
 float( 
 pdflp(x, p0, v, p1, p2, t1, t2)* 
 cdfmaxlp(log(p1)-x, p0, v, p1, p2, t1, t2) 
 ), 
 x, minf, log(p1)); 

使用某些值评估 upandin 崩溃:
upandin(1, .15, 1.01, 1.02, 1/365.2425, 2/365.2425); 

rat: replaced -.00995033085316809 by -603/60601 = -.00995033085262619 

rat: replaced 2.718281828459045 by 23225/8544 = 2.718281835205993 

rat: replaced 8116.5 by 16233/2 = 8116.5 

rat: replaced 2.718281828459045 by 23225/8544 = 2.718281835205993 

rat: replaced -8116.5 by -16233/2 = -8116.5 

rat: replaced 1.0 by 1/1 = 1.0 

rat: replaced 1.792882852833688 by 4484/2501 = 1.792882846861255 

rat: replaced 180.1832400641081 by 126849/704 = 180.1832386363636 

rat: replaced 2.718281828459045 by 23225/8544 = 2.718281835205993 

rat: replaced -8116.5 by -16233/2 = -8116.5 

rat: replaced -1.0 by -1/1 = -1.0 

rat: replaced 1.792882852833688 by 4484/2501 = 1.792882846861255 

rat: replaced 180.1832400641081 by 126849/704 = 180.1832386363636 

rat: replaced 2.718281828459045 by 23225/8544 = 2.718281835205993 

rat: replaced -8116.5 by -16233/2 = -8116.5 

rat: replaced 1.0 by 1/1 = 1.0 

rat: replaced -1.0 by -1/1 = -1.0 
Maxima encountered a Lisp error: 

 The value 16090668801 is not of type FIXNUM. 

如果没有 upandin 中的 float(),Maxima 只留下积分
原始形式。

有人可以帮忙吗?我认为将 Mathematica 转换为 Maxima 将是
很容易,但现在我不太确定。

Mathematica 版本工作正常:
pdflp[x_, p0_, v_, p1_, p2_, t1_, t2_] :=  
 PDF[NormalDistribution[Log[p0],Sqrt[t1]*v]][x] 

cdfmaxlp[x_, p0_, v_, p1_, p2_, t1_, t2_] := 1-Erf[x/(v*Sqrt[t2-t1]/Sqrt[2])]; 

(* NIntegrate below "equivalent" to Maximas float(); no closed form *) 

upandin[p0_, v_, p1_, p2_, t1_, t2_] :=  
 NIntegrate[pdflp[x, p0, v, p1, p2, t1, t2]* 
           cdfmaxlp[Log[p1]-x, p0, v, p1, p2, t1, t2], 
{x, -Infinity, Log[p1]}] 

upandin[1, .15, 1.01, 1.02, 1/365.2425, 2/365.2425] 

0.0998337 

编辑:是否有任何开源的类似 Mathematica 的程序
数值近似这个函数?我真的很想公开
源代码到开源平台。

最佳答案

(我可能没有办法回答这个问题,但是......)

只是一个猜测,但似乎集成想要再次使输入精确,并且可能正在做一些涉及有理算术的困难 bignum 计算。它使您的近似 e(欧拉数)合理化,因此这意味着它的行为可能与积分(具有精确输入的 0)不同。

可能想检查

http://eagle.cs.kent.edu/MAXIMA/maxima_21.html

或者

http://www.delorie.com/gnu/docs/maxima/maxima_62.html

用于专用数字代码,例如来自 Quadpack。

(仍然想知道为什么我什至试图回答这个问题。在 Stack Overflow 的某个地方一定有 Maxima 的专业知识。)

丹尼尔·利希布劳
Wolfram 研究

关于wolfram-mathematica - Maxima 在相对简单的积分上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4929171/

相关文章:

plot - 带虚线的最大值图

简化常数

在 Emacs 上调试 Maxima CAS Lisp 代码

wolfram-mathematica - 如何设置全局 Abort 处理程序?

wolfram-mathematica - 有什么可能的方法来迫使Mathematica将-1 + a表示为a-1

math - Mathematica的NullSpace符号矩阵命令的假设

maxima - Plot2d 切入 3D 功能

wolfram-mathematica - 如何在源代码级别区分 2 个笔记本?

wolfram-mathematica - 在 Mathematica 中的给定点评估系统

最大值排序 [x=value1, x=value2,...] 形式的元素列表