在Python中解析复杂的数学函数

时间:2017-02-28 23:10:37

标签: python parsing numpy math expression

Python中有没有办法用Python解析描述3D图形的数学表达式?是否使用其他数学模块。我似乎找不到办法处理两个输入。

我想要解析的函数示例是Holder Table Function

它有多个输入,三角函数,我也需要解析abs()部分。

我有两个2D numpy网格物体作为x1和x2的输入,并且更愿意将它们直接传递给表达式以供评估。

非常感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:3)

编写评估此公式的直接numpy代码并不难。

def holder(x1, x2):
    f1 = 1 - np.sqrt(x1**2 + x2**2)/np.pi
    f2 = np.exp(np.abs(f1))
    f3 = np.sin(x1)*np.cos(x2)*f2
    return -np.abs(f3)

在某一点评估:

In [109]: holder(10,10)
Out[109]: -15.140223856952055

在网格上进行评估:

In [60]: I,J = np.mgrid[-bd:bd:.01, -bd:bd:.01]
In [61]: H = holder(I,J)

快速肮脏的同情

在没有阅读大部分文档的情况下潜入sympy

In [65]: from sympy.abc import x,y
In [69]: import sympy as sp
In [70]: x
Out[70]: x
In [71]: x**2
Out[71]: x**2
In [72]: (x**2 + y**2)/sp.pi
Out[72]: (x**2 + y**2)/pi
In [73]: 1-(x**2 + y**2)/sp.pi
Out[73]: -(x**2 + y**2)/pi + 1
In [75]: from sympy import Abs
...
In [113]: h = -Abs(sp.sin(x)*sp.cos(y)*sp.exp(Abs(1-sp.sqrt(x**2 + y**2)/sp.pi)))
In [114]: float(h.subs(x,10).subs(y,10))
Out[114]: -15.140223856952053

或者DSM建议的同情

In [117]: h1 = sp.sympify("-Abs(sin(x)*cos(y)*exp(Abs(1-sqrt(x**2 + y**2)/pi)))")
In [118]: h1
Out[118]: -exp(Abs(sqrt(x**2 + y**2)/pi - 1))*Abs(sin(x)*cos(y))
In [119]: float(h1.subs(x,10).subs(y,10))
Out[119]: -15.140223856952053
...
In [8]: h1.subs({x:10, y:10}).n()
Out[8]: -15.1402238569521

现在我如何在numpy数组中使用它?

Evaluating the result of sympy lambdify on a numpy mesgrid

In [22]: f = sp.lambdify((x,y), h1,  [{'ImmutableMatrix': np.array}, "numpy"])
In [23]: z = f(I,J)
In [24]: z.shape
Out[24]: (2000, 2000)
In [25]: np.allclose(z,H)
Out[25]: True
In [26]: timeit holder(I,J)
1 loop, best of 3: 898 ms per loop
In [27]: timeit f(I,J)
1 loop, best of 3: 899 ms per loop

有趣 - 速度基本相同。

早些时候回答这一行:How to read a system of differential equations from a text file to solve the system with scipy.odeint?