也许我忽略了明显但你如何防止同情重新排列方程?
我在iPython笔记本中使用Sympy,因此我可以轻松地将Latex代码复制粘贴到Lyx,但我希望方程式与我定义它们的顺序相同.
例如,灰体辐射的公式是其温度的函数:

Sympy自动将温度组件放在前面,这给出了一个非常不寻常的公式表示.反正有没有阻止这个?
我有一个与轨道力学中的太阳同步共振条件有关的方程.我目前正在学习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) 我用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).是否有同情函数来简化这一点?
我想把一个字符串3cm/µs² + 4e-4 sqmiles/km/h**2分成它的SI单位(在这种情况下m/s**2)和它的大小(以该单位的倍数).
由于sympy提供了解析模块和许多物理单元和SI前缀,我想使用sympy将是一个好主意.但实现这一目标的好方法是什么?我会写一个类似下面的算法,但我想避免重新发明方形轮:
4e-4类似的语法)和空格(除非它在显式运算符旁边)之间的转换视为乘法,然后标记化Magnitude * some SI units(在不一致的单元上给出有意义的错误消息,例如Cannot add m**2 to s)这可以通过现有手段轻松实现吗?或者如何最好地实施?
使用SymPy,是否可以将符号/变量的可能值限制在一定范围内?我现在可以在定义符号时设置一些属性,比如positive=True,但是我需要更多的控制,即我需要将它设置为区间[0,1].然后应该使用这个假设来解决,简化等.
我认为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可能正在使用拉普拉斯变换来计算傅里叶变换.
以下问题
并且他们各自的答案让我想到我如何能够有效地解析一个(或多或少可信的)用户给出的单个数学表达式(一般来说,就这个答案而言)/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) 在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) 今天我发现了这个
>>> 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看到了这个
基于我在这里找到的前一个例子,我试图找出如何生成一个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)