标签: sympy

防止Sympy重新排列等式

也许我忽略了明显但你如何防止同情重新排列方程?

我在iPython笔记本中使用Sympy,因此我可以轻松地将Latex代码复制粘贴到Lyx,但我希望方程式与我定义它们的顺序相同.

例如,灰体辐射的公式是其温度的函数:

在此输入图像描述

Sympy自动将温度组件放在前面,这给出了一个非常不寻常的公式表示.反正有没有阻止这个?

python sympy

10
推荐指数
2
解决办法
1838
查看次数

SymPy无法解决Matlab可以解决的等式

我有一个与轨道力学中的太阳同步共振条件有关的方程.我目前正在学习Python,所以我尝试使用以下代码在SymPy中解决它:

from sympy import symbols,solve

[n_,Re_,p_,i_,J2_,Pe_] = symbols(['n_','Re_','p_','i_','J2_','Pe_'])

del_ss = -((3*n_*(Re_**2)*J2_/(4*(p_**2)))*(4-5*(sin(i_)**2)))-((3*n_*(Re_**2)*J2_/(2*(p_**2)))*cos(i_))-((2*pi)/Pe_)

pprint(solve(del_ss,i_))
Run Code Online (Sandbox Code Playgroud)

可以为五个变量成功重新排列表达式,但是当i_solve命令中使用变量时(如上所述),会产生错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 479, in runfile
    execfile(filename, namespace)
  File "C:\Users\Nathan\Python\sympy_test_1.py", line 22, in <module>
    pprint(solve(del_ss,i_))
  File "C:\Python27\lib\site-packages\sympy\solvers\solvers.py", line 484, in solve
    solution = _solve(f, *symbols, **flags)
  File "C:\Python27\lib\site-packages\sympy\solvers\solvers.py", line 700, in _solve
    soln = tsolve(f_num, symbol)
  File "C:\Python27\lib\site-packages\sympy\solvers\solvers.py", line 1143, in tsolve
    "(tsolve: at least one Function expected at this point")
NotImplementedError: …
Run Code Online (Sandbox Code Playgroud)

python sympy

9
推荐指数
1
解决办法
1638
查看次数

在同情中忽略想象的根源

我用sympy来解决多项式:

x = Symbol('x')
y = solve(int(row["scaleA"])*x**3 + int(row["scaleB"])*x**2 + int(row["scaleC"])*x + int(row["scaleD"]), x)
Run Code Online (Sandbox Code Playgroud)

y是可能的解决方案列表.但是,我需要忽略虚构的,只使用真正的解决方案.此外,我希望解决方案作为一个值而不是表达式.现在它看起来像:

[-2/3 - 55**(1/3)*(-1/2 - sqrt(3)*I/2)/3, -2/3 - 55**(1/3)*(-1/2 + sqrt(3)*I/2)/3, -55**(1/3)/3 - 2/3]
Run Code Online (Sandbox Code Playgroud)

我需要最后一个表达式的值(-2.22756).是否有同情函数来简化这一点?

python math sympy

9
推荐指数
3
解决办法
4522
查看次数

如何解析和简化像'3cm /μs²+ 4e-4 sqmiles/km/h**2'的字符串正确处理物理单位?

我想把一个字符串3cm/µs² + 4e-4 sqmiles/km/h**2分成它的SI单位(在这种情况下m/s**2)和它的大小(以该单位的倍数).

由于sympy提供了解析模块许多物理单元和SI前缀,我想使用sympy将是一个好主意.但实现这一目标的好方法是什么?我会写一个类似下面的算法,但我想避免重新发明方形轮:

  • 将数字和字母(除了4e-4类似的语法)和空格(除非它在显式运算符旁边)之间的转换视为乘法,然后标记化
  • 用SI表示替换每个非数字标记(也检查SI前缀)
  • 将新表达式简化为Magnitude * some SI units(在不一致的单元上给出有意义的错误消息,例如Cannot add m**2 to s)

这可以通过现有手段轻松实现吗?或者如何最好地实施?

python parsing sympy

9
推荐指数
1
解决办法
736
查看次数

SymPy:将符号/变量限制为间隔

使用SymPy,是否可以将符号/变量的可能值限制在一定范围内?我现在可以在定义符号时设置一些属性,比如positive=True,但是我需要更多的控制,即我需要将它设置为区间[0,1].然后应该使用这个假设来解决,简化等.

range solver sympy intervals

9
推荐指数
2
解决办法
5250
查看次数

傅立叶变换Sympy中的trig函数返回意外结果

我认为Sympy在计算trig函数的傅里叶变换时犯了一个错误.例如:

from sympy import fourier_transform, sin
from sympy.abc import x, k
print fourier_transform(sin(x), x, k)
Run Code Online (Sandbox Code Playgroud)

Mathematica的预期答案是

在此输入图像描述

但Sympy返回0.有时候该功能运行得很好,fourier_transform(Heaviside(t)*cos(t),t,omega)fourier_transform(Heaviside(t)*sin(t),t,omega)返回正确的答案.我认为Sympy可能正在使用拉普拉斯变换来计算傅里叶变换.

python integration sympy continuous-fourier

9
推荐指数
1
解决办法
1466
查看次数

快速评估大量输入值的数学表达式(函数)

以下问题

并且他们各自的答案让我想到我如何能够有效地解析一个(或多或少可信的)用户给出的单个数学表达式(一般来说,就这个答案而言)/sf/answers/41600611/来自数据库的20k到30k输入值.我实施了快速而肮脏的基准测试,因此我可以比较不同的解

# Runs with Python 3(.4)
import pprint
import time

# This is what I have
userinput_function = '5*(1-(x*0.1))' # String - numbers should be handled as floats
demo_len = 20000 # Parameter for benchmark (20k to 30k in real life)
print_results = False

# Some database, represented by an array of dicts (simplified for this example)

database_xy = []
for a in range(1, demo_len, 1):
    database_xy.append({
        'x':float(a),
        'y_eval':0,
        'y_sympya':0,
        'y_sympyb':0,
        'y_sympyc':0,
        'y_aevala':0, …
Run Code Online (Sandbox Code Playgroud)

python eval abstract-syntax-tree sympy numexpr

9
推荐指数
1
解决办法
2902
查看次数

如何在SymPy中扩展矩阵表达式?

在SymPy中,我试图执行矩阵乘法并在之后展开它.但是,SymPy似乎不支持矩阵表达式的扩展.例如,这是矩阵的4阶Runge-Kutta(RK4):

from sympy import init_session
init_session()
from sympy import *

A = MatrixSymbol('A', 3, 3)
x = MatrixSymbol('x', 3, 1)
dt = symbols('dt')

k1 = A*x
k2 = A*(x + S(1)/2*k1*dt)
k3 = A*(x + S(1)/2*k2*dt)
k4 = A*(x + k3*dt)
final = dt*S(1)/6*(k1 + 2*k2 + 2*k3 + k4)
final.expand()
Run Code Online (Sandbox Code Playgroud)

产生结果

Traceback (most recent call last)
<ipython-input-38-b3ff67883c61> in <module>()
     12 final = dt*1/6*(k1+2*k2+2*k3+k4)
     13 
---> 14 final.expand()

AttributeError: 'MatMul' object has no attribute 'expand'
Run Code Online (Sandbox Code Playgroud)

我希望表达式可以像标量变量一样扩展:

A,x,dt = symbols('A x …
Run Code Online (Sandbox Code Playgroud)

python matrix symbolic-math sympy

9
推荐指数
1
解决办法
1210
查看次数

Sympy类Zero,One和NegativeOne,为什么它们存在?

今天我发现了这个

>>> type(1)
<class 'sympy.core.numbers.One'>
>>> type(0)
<class 'sympy.core.numbers.Zero'>
>>> type(-1)
<class 'sympy.core.numbers.NegativeOne'>
>>> type(2)
<class 'sympy.core.numbers.Integer'>
Run Code Online (Sandbox Code Playgroud)

从同意这些类型的文档中查看了文档,但它没有说明它们存在的原因.是否有理由为-1,0和1设置3个特殊单例类?

编辑:我在SymPy在线shell看到了这个

python sympy

9
推荐指数
1
解决办法
270
查看次数

使用SymPy codegen为方程组生成Fortran子例程

基于我在这里找到的前一个例子,我试图找出如何生成一个Fortran代码,该代码对应于我需要坚持的特定形式.所需的FORTRAN代码将如下所示(它基于FitzHugh-Nagumo模型):

  SUBROUTINE FF(NE,U,PAR,F) 
!     ---------- -- 
!     Define the nonlinear term

  IMPLICIT NONE
  INTEGER, INTENT(IN) :: NE
  DOUBLE PRECISION, INTENT(IN) :: U(NE),PAR(*)
  DOUBLE PRECISION, INTENT(OUT) :: F(NE)

  DOUBLE PRECISION u,v,e,a1,a0

    u=U(1)
    v=U(2)
    e=PAR(1)
    a1=PAR(2)
    a0=PAR(3)

    F(1)= u-u**3-v 
    F(2)= e*(u-a1*v-a0)

  END SUBROUTINE FF
Run Code Online (Sandbox Code Playgroud)

我设法在SymPy中创建正确的表达式,但我还没弄清楚如何生成所需的代码codegen.这是我到目前为止的尝试:

from sympy import symbols,latex
from sympy.utilities.codegen import codegen
from sympy.tensor import IndexedBase, Idx
from sympy import Matrix
U, PAR = symbols('U PAR', cls=IndexedBase)

u = U[1]
v = U[2]

e = …
Run Code Online (Sandbox Code Playgroud)

python code-generation sympy python-2.7 codegen

9
推荐指数
1
解决办法
248
查看次数