我有一个与轨道力学中的太阳同步共振条件有关的方程.我目前正在学习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,是否可以将符号/变量的可能值限制在一定范围内?我现在可以在定义符号时设置一些属性,比如positive=True,但是我需要更多的控制,即我需要将它设置为区间[0,1].然后应该使用这个假设来解决,简化等.
今天我发现了这个
>>> 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) 我在Python中有两个字符串,
A m * B s / (A m + C m)
Run Code Online (Sandbox Code Playgroud)
和
C m * B s / (C m + A m)
Run Code Online (Sandbox Code Playgroud)
它们都是无序集(A,C)和无序集(B)的等价函数.m和s表示可以在相同但不与另一个单元交换的单位.
到目前为止,我正在进行A,B和C的排列,并使用eval和SymPy的==运算符对它们进行测试.这有许多缺点:
有没有pythonian方法来测试这种等价?它应该是一个任意的表达式.
好的,所以我有几个多维的numpy数组的sympy对象(表达式).例如:
A = array([[1.0*cos(z0)**2 + 1.0, 1.0*cos(z0)],
[1.0*cos(z0), 1.00000000000000]], dtype=object)
Run Code Online (Sandbox Code Playgroud)
等等.
我想要做的是使用einsum将这些数组中的几个相乘,因为我已经通过我之前做过的数值计算得到了它的语法.问题是,当我尝试做类似的事情时
einsum('ik,jkim,j', A, B, C)
Run Code Online (Sandbox Code Playgroud)
我收到类型错误:
TypeError: invalid data type for einsum
Run Code Online (Sandbox Code Playgroud)
当然,所以在谷歌上快速搜索显示我可能无法做到这一点,但没有理由为什么.特别是,在这些数组上调用numpy.dot()和numpy.tensordot()函数就像一个魅力.我可以使用tensordot来做我需要的事情,但是当我考虑用嵌套的tensordot调用替换上面的那些(如下的顺序非常重要)的50个左右的Einsten总结时,我的大脑会受到伤害.更糟糕的是,虽然必须调试该代码并寻找那个错位的索引交换.
长话短说,有谁知道为什么tensordot与物体一起工作但是einsum不会?有关解决方法的任何建议吗?如果没有,关于我如何编写自己的包装器到嵌套的tensordot调用的任何建议有点类似于einsum符号(数字而不是字母都可以)?
标题说明了一切.有没有办法序列化sympy.lambdify生成的函数?:
import sympy as sym
import pickle
import dill
a, b = sym.symbols("a, b")
expr = sym.sin(a) + sym.cos(b)
lambdified_expr = sym.lambdify((a, b), expr, modules="numpy")
pickle.dumps(lambdified_expr) # won't work
dill.dumps(lambdified_expr) # won't work either
Run Code Online (Sandbox Code Playgroud)
...我想这样做的原因是因为我的代码生成了很多lambdified函数,但我发现它每次都需要很长时间.
好的,我知道如何init_printing使用MathJax自动呈现IPython输出.
from sympy import init_printing
init_printing()
Run Code Online (Sandbox Code Playgroud)
我怎么让它停下来?(是的,我可以重置我的笔记本电脑,但我想把它打开只是为了几个单元格并再次关闭它.)
我在python中编写了一个脚本,它使用sympy来计算几个向量/矩阵公式.但是,当我尝试将这些函数转换为我可以使用sympy.lambdify进行评估的函数时,我得到了一个
SyntaxError:扫描字符串文字时的EOL
这里有一些代码有相同的错误,所以你可以看到我的意思.
import sympy
x = sympy.MatrixSymbol('x',3,1)
f = sympy.lambdify(x, x.T*x)
Run Code Online (Sandbox Code Playgroud)
因此,语法错误与表达式"x'.dot(x)"和".T"到'的转换有关.
我如何解决这个问题,从上面的lambdify中正确定义f?
鉴于一些˚F和微分方程X "(吨)= ˚F(X(吨)),我如何计算X (Ñ)(吨而言)X(吨)?
例如,给定f(x(t))= sin(x(t)),我想得到x (3)(t)=(cos(x(t))2 - sin(x(t))2)sin(x(t)).
到目前为止我已经尝试过了
>>> from sympy import diff, sin
>>> from sympy.abc import x, t
>>> diff(sin(x(t)), t, 2)
Run Code Online (Sandbox Code Playgroud)
这给了我
-sin(x(t))*Derivative(x(t), t)**2 + cos(x(t))*Derivative(x(t), …Run Code Online (Sandbox Code Playgroud)