天道酬勤,学无止境

处理Sympy积分返回的分段方程(Dealing with piecewise equations returned by sympy integrate)

问题

在sympy中,我有一个返回逐段对象的积分,例如

In [2]: from sympy.abc import x,y,z

In [3]: test = exp(-x**2/z**2)

In [4]: itest = integrate(test,(x,0,oo))

In [5]: itest
Out[5]: 
⎧   ___                                                   
⎪ ╲╱ π ⋅z       │                 ⎛      1          ⎞│   π
⎪ ───────   for │periodic_argument⎜──────────────, ∞⎟│ ≤ ─
⎪    2          │                 ⎜          2      ⎟│   2
⎪               │                 ⎝polar_lift (z)   ⎠│    
⎪                                                         
⎪∞                                                        
⎪⌠                                                        
⎨⎮    2                                                   
⎪⎮  -x                                                    
⎪⎮  ───                                                   
⎪⎮    2                                                   
⎪⎮   z                                                    
⎪⎮ ℯ    dx                    otherwise                   
⎪⌡                                                        
⎪0                                                        
⎩    

我只想提取该分段方程式的第一个分支,换句话说,我希望能够执行类似itest.parts(0)来简单提取sqrt(pi)*z/2 。 我似乎找不到任何方法可以执行此操作,但是也许我在文档中使用了错误的搜索词。 有任何想法吗?

编辑

itest.args[0][0]一下,我设法找到了如果执行itest.args[0][0] ,则可以提取此表达式。 但是,这似乎有点骇人听闻。 有没有更好的方法?

回答1

通常,使用.args是访问表达式各部分的正确方法。

不过,在这种情况下,有一个integrate选项可以让您忽略收敛条件

In [39]: integrate(test, (x, 0, oo), conds='none')
Out[39]:
  ___
╲╱ π ⋅z
───────
   2

另外,如果您明确设置了变量已知的假设,那么收敛条件通常会自行解决(不过,对于z任何简单假设,在这种情况下似乎都不会发生)。 例如,如果您知道z是实数,则使用z = Symbol('z', real=True) 。 通常,当您知道事情是真实的,甚至更好的是积极的时,这将在确保融合方面大有帮助。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Dealing with piecewise equations returned by sympy integrate
    In sympy I have an integral which returns a Piecewise object, e.g. In [2]: from sympy.abc import x,y,z In [3]: test = exp(-x**2/z**2) In [4]: itest = integrate(test,(x,0,oo)) In [5]: itest Out[5]: ⎧ ___ ⎪ ╲╱ π ⋅z │ ⎛ 1 ⎞│ π ⎪ ─────── for │periodic_argument⎜──────────────, ∞⎟│ ≤ ─ ⎪ 2 │ ⎜ 2 ⎟│ 2 ⎪ │ ⎝polar_lift (z) ⎠│ ⎪ ⎪∞ ⎪⌠ ⎨⎮ 2 ⎪⎮ -x ⎪⎮ ─── ⎪⎮ 2 ⎪⎮ z ⎪⎮ ℯ dx otherwise ⎪⌡ ⎪0 ⎩ I would like to extract just the first branch of this piecewise equation, in other words, I would like to be able to do something like itest.parts(0)to extract simply sqrt(pi)*z/2. I can't seem to find any way to do
  • Python中的数学方程式处理(Mathematical equation manipulation in Python)
    问题 我想开发一个显示给定数学方程的GUI应用程序。 当您单击方程式中的特定变量以表示它是未知变量(即要计算)时,方程式将自身转换以评估所需的未知变量。 例如: a = (b+c*d)/e d = (a*e - b)/c 到目前为止,我只想知道如何根据用户输入重新排列给定的方程式。 我从哥哥那里得到的一个建议是在后端使用前缀/后缀符号表示法对其进行评估。 这是唯一的方法还是有更简单的建议? 另外,我不仅将使用基本的数学函数,而且还将使用三角学和微积分(我认为是基本的。没有偏微分微积分等等)。 我认为,前/后注记法评估可能对评估更高的数学函数没有帮助。 但这只是我的意见,所以请指出我是否错。 另外,我将使用SymPy进行数学评估,因此评估给定的数学方程式不是问题,从给定的通用方程式创建特定方程式是我的主要问题。 回答1 使用SymPy,您的示例将如下所示: >>> import sympy >>> a,b,c,d,e = sympy.symbols('abcde') >>> r = (b+c*d)/e >>> l = a >>> r = sympy.solve(l-r,d) >>> l = d >>> r [(-b + a*e)/c] >>> 它似乎也适用于三角函数: >>> l = a >>> r = b*sympy.sin(c) >>> sympy.solve(l-r,c)
  • 如何在Python中求解方程式? [关闭](How can I solve equations in Python? [closed])
    问题 关门了。 这个问题需要更加集中。 它当前不接受答案。 想要改善这个问题吗? 更新问题,使其仅通过编辑此帖子即可将重点放在一个问题上。 5年前关闭。 改善这个问题 假设我有一个方程: 2x + 6 = 12 使用代数,我们可以看到x = 3 。 如何使用Python编写可以解决x ? 我是编程的新手,我查看了eval()和exec()但我不知道如何使它们执行我想要的操作。 我不想使用外部库(例如SAGE),我只想在纯Python中执行此操作。 回答1 SymPy呢? 他们的求解器看起来像您所需要的。 如果您想自己构建库,请查看它们的源代码… 回答2 有两种方法可以解决此问题:数字方式和符号方式。 要用数字方式解决它,您必须首先将其编码为“可运行”功能-插入一个值,取出一个值。 例如, def my_function(x): return 2*x + 6 解析一个字符串来自动创建这样的函数是很有可能的。 假设您将2x + 6解析为一个列表[6, 2] (其中列表索引对应于x的幂-因此6 * x ^ 0 + 2 * x ^ 1)。 然后: def makePoly(arr): def fn(x): return sum(c*x**p for p,c in enumerate(arr)) return fn my_func = makePoly([6, 2]) my_func(3)
  • 用Python解决数学方程式的最简单方法(Simplest way to solve mathematical equations in Python)
    问题 我想求解一组线性或有时是二次方程式。 我没有特定的问题,但是通常,我经常遇到这种情况。 使用Wolframalpha.com(相当于Mathematica的网络版)来解决问题很简单。 但这不能提供iPython shell的舒适性和便利性。 是否有一个简单的库可用于处理来自python shell的线性和二次方程式? 就个人而言,我发现使用Casio 991 MS科学计算器极为方便。 我知道如何设置变量,求解方程式以及做很多事情。 我希望最好在ipython shell中使用这样的工具。 没发现任何东西我感到很惊讶。 圣人没有给我足够的印象。 也许我缺少了一些东西。 回答1 sympy正是您要找的东西。 回答2 您认为最好的答案是无法接受的。 您的问题是“我想要一个可以在Python中使用的免费计算机代数系统”。 答案是“ SAGE做到了”。 您是否看过最大值/骨质疏松症? SAGE为此提供了绑定,这是功能更强大的免费版本之一。 http://maxima.sourceforge.net/ 回答3 这是使用Python(通过Sage)解决原始问题的方法。 这从根本上澄清了保罗·麦克米兰(Paul McMillan)的上述言论。 sage: a,b,c = var('a,b,c') sage: solve([a+b+c==1000, a^2+b^2==c^2], a,b,c)
  • 如何使用Python求解一对非线性方程?(How to solve a pair of nonlinear equations using Python?)
    问题 使用Python解决一对非线性方程式的(最佳)方法是什么? (Numpy,Scipy或Sympy) 例如: x + y ^ 2 = 4 e ^ x + xy = 3 解决以上问题的代码段会很棒 回答1 对于数值解,可以使用fsolve: http://docs.scipy.org/doc/scipy/reference/generation/scipy.optimize.fsolve.html#scipy.optimize.fsolve from scipy.optimize import fsolve import math def equations(p): x, y = p return (x+y**2-4, math.exp(x) + x*y - 3) x, y = fsolve(equations, (1, 1)) print equations((x, y)) 回答2 如果您喜欢sympy,则可以使用nsolve。 >>> nsolve([x+y**2-4, exp(x)+x*y-3], [x, y], [1, 1]) [0.620344523485226] [1.83838393066159] 第一个参数是方程式列表,第二个参数是变量列表,第三个参数是初始猜测。 回答3 简短答案:使用fsolve 正如其他答案中提到的那样
  • 使用Sympy方程进行绘图(Using Sympy Equations for Plotting)
    问题 创建Sympy方程,进行导数运算然后绘制该方程结果的最佳方法是什么? 我有我的符号方程式,但无法弄清楚如何绘制一组用于绘图的值。 这是我的代码: from sympy import symbols import matplotlib.pyplot as mpl t = symbols('t') x = 0.05*t + 0.2/((t - 5)**2 + 2) nums = [] for i in range(1000): nums.append(t) t += 0.02 plotted = [x for t in nums] mpl.plot(plotted) mpl.ylabel("Speed") mpl.show() 就我而言,我只是计算了该方程式的导数,现在我想绘制速度x ,因此这是相当简化的。 回答1 可以使用numpy.linspace()(创建x轴的值x_vals在下面的代码)和lambdify()。 from sympy import symbols from numpy import linspace from sympy import lambdify import matplotlib.pyplot as mpl t = symbols('t') x = 0.05*t + 0.2/((t - 5)**2 + 2) lam_x = lambdify(t
  • 防止Sympy重新排列方程式(Prevent Sympy from rearranging the equation)
    问题 也许我忽略了显而易见的东西,但是如何防止sympy重新排列方程式? 我在iPython笔记本中使用了Sympy,因此我可以轻松地将Latex代码复制粘贴到Lyx,但是我希望方程与定义它们的顺序相同。 例如,灰体辐射的公式取决于其温度: Sympy自动将“温度”组件放置在最前面,这给了公式一个非常不寻常的表示。 反正是有防止这种情况发生的吗? 回答1 当前,在SymPy中无法完全按照输入的内容打印内容,因为该信息甚至都没有保存在任何地方。 我相信乘法运算中,符号按字母顺序排列,大写字母位于小写字母之前(基本上,顺序来自ord )。 我能想到的最好的技巧是对latex使用symbol_names选项,该选项可让您更改用于LaTeX表示形式中的Symbol的名称。 顺序仍将基于原始符号的名称,因此您可以欺骗它: >>> from sympy.abc import epsilon, omega, t >>> latex(epsilon*sigma*t**4, symbol_names={t:"T"}) \epsilon \sigma T^{4} 如果要在笔记本上漂亮打印,则必须编写打印扩展名的自定义版本,以将symbol_names dict传递给latex 。 参见https://github.com/sympy/sympy/blob/master/sympy
  • 初步认识泊松重建(比较全的综合教程)
    整个算法的步骤包括对具有法向量信息的输入点云信息的预处理,对全局问题离散化,对离散化后的子数据求解,求解泊松问题后的等值面提取,以及后期优化处理等。 表面重建过程: 1、定义八叉树。使用八叉树结构存储点集,根据采样点集的位置定义八叉树,然后细分八叉树使每个采样点都落在深度为D的叶节点; 2、设置函数空间:对八叉树的每个节点设置空间函数F,所有节点函数F的线性和可以表示向量场V,基函数F采用了盒滤波的n维卷积; 3、创建向量场:均匀采样的情况下,假设划分的块是常量,通过向量场V逼近指示函数的梯度。采用三次条样插值(三线插值); 4、求解泊松方程:方程的解采用拉普拉斯矩阵迭代求出; 5、提取等值面:为得到重构表面,需要选择阈值获得等值面;先估计采样点的位置,然后用其平均值进行等值面提取,然后用移动立方体算法得到等值面。 泊松曲面重建基于泊松方程。泊松方程是一个比较常见的偏微分方程,在很多领域被应用,如高动态范围图像的调和映射、图像区域的无缝编辑、流体力学、网格编辑等, 多重网格泊松方法已应用于高效GPU计算。 由梯度关系得到采样点和指示函数的积分关系,根据积分关系利用划分块的方法获得点集的向量场,计算指示函数梯度场的逼近,构成泊松方程。根据泊松方程使用矩阵迭代求出近似解,采用移动立方体算法提取等值面,对所测数据点集重构出被测物体的模型,泊松方程在边界处的误差为零
  • python求解各种复杂的线性/非线性方程组
    如何用Python求解各种复杂的线性/非线性方程组 Python求解各种复杂的线性/非线性方程组一、线性方程组。二、非线性方程组。1.scipy求解2.sympy求解 三、scipy和sympy的优缺点分析。四、总结 Python求解各种复杂的线性/非线性方程组 本文将要介绍几种方法去求解各种复杂的方程组,包括实数域和复数域的线性、非线性方程组,并对比这几种方法的优缺点。本文用到了numpy、scipy、sympy这三个科学计算包。 一、线性方程组。 线性方程组可以用numpy去求解。 1.实数域。 import numpy as np a=np.mat('1,2,3;2,4,8;9,6,3') b=np.mat('1;1;3') c=np.linalg.solve(a,b) 输出如下: 2.复数域。 import numpy as np a=np.mat('1,-1j;1j,-1') b=np.mat('1;1') c=np.linalg.solve(a,b) 输出如下: 二、非线性方程组。 scipy和sympy不但可以解线性方程(组),还可以求解非线性方程(组),但是也有各自的优缺点。 1.scipy求解 scipy.optimize里面有两个函数可以数值求解方程组,分别是root和solve,这两个函数会找到方程组的一个近似解。下面通过例子介绍这两个函数的使用。 (1)
  • 在Matlab中构造分段符号函数(Constructing piecewise symbolic function in Matlab)
    问题 我正在尝试在Matlab中生成分段符号函数。 它必须具有象征性的原因是我希望以后能够集成/区分该功能和/或插入实际值。 我有以下功能: x^3/6 -> 0 < x <= 1 (1/6)*(-3*x^3+12*x^2-12x+4) -> 1 < x <= 2 (1/6)*(3*x^3-24*x^2+60x-44) -> 2 < x <= 3 (1/6)*(4-x)^3 -> 3 < x <= 4 0 -> otherwise 例如,我想将此函数放在变量中(假设为f),然后调用 int(diff(f, 1)^2, x, 0, 4) % numbers could be different 并获得(标量)结果2/3。 我尝试了各种方法,包括piecewise()函数和符号比较,但是没有任何效果……您能帮上忙吗? :-) 回答1 一种选择是使用重组分函数使每个方程在其给定范围之外等于零,然后将它们全部加到一个方程中: syms x; f = (heaviside(x)-heaviside(x-1))*x^3/6 + ... (heaviside(x-1)-heaviside(x-2))*(1/6)*(-3*x^3+12*x^2-12*x+4) + ... (heaviside(x-2)-heaviside(x-3))*(1/6)*(3*x^3-24*x^2+60*x-44) +
  • python科学计算第三版-python科学计算pdf下载
    python科学计算第二版是一本Python语言基础教程,由张若愚编著,小编从网上收集而来,为各位免费提供下载和阅读;本书将使用Python各种扩展库完成数值计算、界面制作、三维可视化、图像处理、提高运算速度等任务。 ​python科学计算第二版简介: python科学计算(第2版)详细介绍Python科学计算中常用的扩展库NumPy、SciPy、matplotlib、Pandas、SymPy、TTK、Mayavi、OpenCV、Cython,涉及数值计算、界面制作、三维可视化、图像处理、提高运算效率等多方面的内容。所附光盘中包含所有章节的Notebook以及便携式运行环境WinPython,以方便读者运行书中所有实例。非常适合于工科高年级本科生、研究生、工程技术人员以及计算机开发人员阅读,也适合阅读过第1版的读者了解各个扩展库的最新进展,进一步深入学习。 章节目录 第1章 Python科学计算环境的安装与简介 1 1.1 Python简介 1 1.1.1 Python 2还是Python 3 1 1.1.2 开发环境 2 1.1.3 集成开发环境(IDE) 5 1.2 IPython Notebook入门 9 1.2.1 基本操作 10 1.2.2 魔法(Magic)命令 12 1.2.3 Notebook的显示系统 20 1.2.4 定制IPython Notebook 24
  • python科学计算-python科学计算 第二版 PDF 下载
    相关截图: 资料简介: 本书详细介绍Python科学计算中最常用的扩展库NumPy、SciPy、matplotlib、Pandas、SymPy、TTK、Mayavi、OpenCV、Cython,涉及数值计算、界面制作、三维可视化、图像处理、提高运算效率等多方面的内容。所附光盘中包含所有章节的Notebook以及便携式运行环境WinPython,以方便读者运行书中所有实例。 资料目录: 第1章 Python科学计算环境的安装与简介 1 1.1 Python简介 1 1.1.1 Python 2还是Python 3 1 1.1.2 开发环境 2 1.1.3 集成开发环境(IDE) 5 1.2 IPython Notebook入门 9 1.2.1 基本操作 10 1.2.2 魔法(Magic)命令 12 1.2.3 Notebook的显示系统 20 1.2.4 定制IPython Notebook 24 1.3 扩展库介绍 27 1.3.1 数值计算库 27 1.3.2 符号计算库 28 1.3.3 绘图与可视化 28 1.3.4 数据处理和分析 29 1.3.5 界面设计 30 1.3.6 图像处理和计算机视觉 31 1.3.7 提高运算速度 31 第2章 NumPy-快速处理数据 33 2.1 ndarray对象 33 2.1.1 创建 34 2.1.2 元素类型 35 2.1.3
  • python求解未知变量的方程式(python solving equations for unknown variable)
    问题 有什么办法可以解决我在python中未知值的方程(无需转置)的问题。 是否有任何进行此类计算的库。 例如:W = mg w = 60,g = 9.81 m =? 谢谢 回答1 尝试SymPy In [1]: from sympy import * In [2]: m = Symbol('m') In [3]: g = 9.81 In [4]: w = m*g In [5]: solve(w - 60, m) Out[5]: [6.11620795107034] 回答2 scipy优化软件包提供了用于数值求解方程的最常用算法的可靠实现。 有关不同类型以及如何使用它们的更多信息,请在此处查看教程页面: http://docs.scipy.org/doc/scipy-0.10.1/reference/tutorial/optimize.html 回答3 您可能对sympy感兴趣: 概述: SymPy是用于符号数学的开源Python库。 它旨在成为一个功能齐全的计算机代数系统(CAS),同时保持代码尽可能的简单,以便于理解和易于扩展。 SymPy完全用Python编写,不需要任何外部库。 http://code.google.com/p/sympy/
  • 是否可以使用Matplotlib绘制隐式方程式?(Is it possible to plot implicit equations using Matplotlib?)
    问题 我想在Matplotlib中绘制隐式方程式(形式为f(x,y)= g(x,y),例如X ^ y = y ^ x)。 这可能吗? 回答1 我不认为对此有很好的支持,但是您可以尝试类似的方法 import matplotlib.pyplot from numpy import arange from numpy import meshgrid delta = 0.025 xrange = arange(-5.0, 20.0, delta) yrange = arange(-5.0, 20.0, delta) X, Y = meshgrid(xrange,yrange) # F is one side of the equation, G is the other F = Y**X G = X**Y matplotlib.pyplot.contour(X, Y, (F - G), [0]) matplotlib.pyplot.show() 有关contour请参阅API文档:如果第四个参数是一个序列,则它指定要绘制的轮廓线。 但是该图将仅与您的范围的分辨率一样好,并且某些功能可能永远无法正确显示,通常是在自相交点。 回答2 既然您已经用sympy标记了这个问题,我将举一个例子。 从文档中:http://docs.sympy.org/latest/modules/plotting
  • 如何在IPython Notebook中编写LaTeX?(How to write LaTeX in IPython Notebook?)
    问题 如何在IPython Notebook中显示LaTeX代码? 回答1 这是我刚刚进行的搜索中发现的,通过更多搜索找到了一个更好的解决方案,IPython笔记本现在具有%%latex魔术,可以使整个单元格Latex没有每行的$$包装。 有关丰富的显示系统,请参阅笔记本浏览 回答2 IPython Notebook使用MathJax在html / markdown中渲染LaTeX。 只需将您的LaTeX数学放入$$ 。 $$c = \sqrt{a^2 + b^2}$$ 或者,您可以显示Python的LaTeX / Math输出,如笔记本之旅结束时所示: from IPython.display import display, Math, Latex display(Math(r'F(k) = \int_{-\infty}^{\infty} f(x) e^{2\pi i k} dx')) 回答3 LaTeX参考: Udacity的Blog具有我见过的最好的LaTeX入门:它清楚地显示了如何以易于阅读和易于记忆的方式使用LaTeX命令! 强烈推荐。 此链接具有出色的示例,同时显示了代码和呈现的结果! 您可以使用此站点通过示例快速学习如何编写LaTeX。 并且,这里是LaTeX命令/符号的快速参考。 总结:在Jupyter / IPython中指示LaTeX的各种方法:
  • Java的代数方程解析器(Algebra equation parser for java)
    问题 我需要一个库来解析方程式,并给我输入结果。 例如这样的事情: String equation = "x + y + z"; Map<String, Integer> vars = new HashMap<String, Integer>(); vars.add("x", 2); vars.add("y", 1), vars.add("z", 3); EquationSolver solver = new EquationSolver(equation, vars); int result = solver.getResult(); System.out.println("result: " + result); 并计算为:6 是否有任何一种Java库可以为我做到这一点? 谢谢 回答1 您可以利用Java 1.6的脚本功能: import javax.script.*; import java.util.*; public class Main { public static void main(String[] args) throws Exception { ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript"); Map<String, Object> vars = new
  • 最齐的Typora使用教程
    最齐全的Typora使用教程 作者:水木子 文章目录 一、Markdown与Typora介绍1.1 Markdown介绍1.2 Typora介绍与下载 二、Markdown语法2.1 标题2.2 字体2.3 各种线2.4 列表2.5 区块2.6 代码2.7 链接2.8 图片2.9 表格 三、Typora与数学公式3.1 如何插入数学公式3.2 上标下标3.3 根号3.4 上下水平线3.5 上下水平大括号3.6 向量符号3.7 分数3.8 积分运算符3.9 求和运算符3.10 连乘运算符3.11 特殊符号3.12 矩阵表示3.13 方程组3.14 分段函数 四、Typora与HTML4.1 改变字体颜色及大小4.2 改变对齐方式4.3 插入图像 五、扩展用法5.1 插入emoji表情5.2 插入目录5.3 导出5.4 文本高亮5.5 上下标 六、参考资料 一、Markdown与Typora介绍 1.1 Markdown介绍 Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档。 Markdown 语言在 2004 由约翰·格鲁伯(英语:John Gruber)创建。 Markdown 编写的文档可以导出 HTML 、Word、图像、PDF、Epub 等多种格式的文档。 Markdown 编写的文档后缀为 .md, .markdown。 1.2
  • Matlab对含噪声图像的滤波操作_两种噪声_三种滤波器_两种方法
    注释很重要 Matlab对含噪声图像的滤波操作。 噪声: 高斯噪声(正态分布)均匀噪声 用到的滤波器: 高斯滤波器盒型滤波器中值滤波器 用到的两种方法: 直接conv2fft2 %%C1 figure; tiledlayout(1,3); img = imread("\LenaG.bmp"); fft = fft2(img); nexttile; imshow(img); title("LenaG"); fft_shift = double(fftshift(fft)); fft_magnitude_shift = abs(fft_shift); nexttile; imshow(log(fft_magnitude_shift),[]); %加对数以便于显示图像,为了更好地显示细节,不进行log变换的话灰度的动态范围被压缩 title("FFT with shift"); fft_angle_shift = angle(fft_shift); nexttile; imshow(fft_angle_shift,[]);%根据 C 中像素值的范围缩放显示.使用 [min(C(:))max(C(:))] 作为显示范围。 imshow 将 C 中的最小值显示为黑色,将最大值显示为白色。使用imshow(A,[]),即可把图像矩阵A显示为正常的灰度图像。本来A是0-1,把double拉伸到
  • 在scipy中集成多维积分(Integrating a multidimensional integral in scipy)
    问题 动机:我有一个多维积分,为完整起见,我在下面复制了该积分。 当存在明显的各向异性时,它来自第二维里系数的计算: W是所有变量的函数。 这是一个已知的函数,我可以为其定义一个python函数。 编程的问题:我如何获得scipy这个表达整合? 我本来打算将两个三元组(scipy.integrate.tplquad)链接在一起,但我担心性能和准确性。 scipy是否有一个高维积分scipy ,可以处理任意数量的嵌套积分? 如果没有,什么是最好的方法呢? 回答1 有了这样的高维积分,蒙特卡洛方法通常是一种有用的技术-它们收敛于答案,作为函数求值数的平方根的倒数,这对高维而言更好,然后您通常会得到均匀的结果。相当复杂的自适应方法(除非您对被积物有非常特定的了解-可以利用的对称性等) mcint程序包执行了蒙特卡洛积分:使用仍然可积分的非平凡W运行,因此我们知道我们得到的答案(请注意,我将r截断为[0,1]); 您必须进行某种对数转换,或执行某些操作以使该半无界域成为对大多数数值积分器来说易于处理的对象): import mcint import random import math def w(r, theta, phi, alpha, beta, gamma): return(-math.log(theta * beta)) def integrand(x): r = x[0]
  • Python中的方程式解析(Equation parsing in Python)
    问题 我怎样才能(轻松地)获取诸如"sin(x)*x^2"类的字符串,用户可能会在运行时输入它,并生成一个可以对x任意值求值的Python函数? 回答1 如果使用Python表示法,则Python自己的内部编译器可以解析此内容。 如果您稍微改变一下表示法,就会更快乐。 import compiler eq= "sin(x)*x**2" ast= compiler.parse( eq ) 您将获得一个可以使用的抽象语法树。 回答2 您可以使用Python parser : import parser from math import sin formula = "sin(x)*x**2" code = parser.expr(formula).compile() x = 10 print(eval(code)) 它的性能要比纯eval并且当然可以避免代码注入! 回答3 f = parser.parse('sin(x)*x^2').to_pyfunc() 当parser可以使用PLY,pyparsing,内置标记生成器,分析器,AST定义。 不要在用户输入上使用eval 。 回答4 pyparsing可能会做您想要的事情(http://pyparsing.wikispaces.com/),尤其是当字符串来自不受信任的来源时。 另请参阅http://pyparsing