我有一些未知数量的符号表达用sympy创建.
例如:
f1 = x
f2 = exp(x)
...
fn = ...
Run Code Online (Sandbox Code Playgroud)
由于它是一个未知数量,我不能简单地做:plot(f1, f2, f3),所以我想传递一个符号表达式列表.我无法弄明白该怎么做?
我有一个MutableDenseMatrix , Q. theta1并且theta2属于SymPy类型symbol.
In[12]: Q
Out[12]: [cos(theta1), -sin(theta1), 0, 0]
[sin(theta1), cos(theta1), 0, 0]
[ 0, 0, 1, 980]
[ 0, 0, 0, 1]
Run Code Online (Sandbox Code Playgroud)
当我打电话给逆时,我得到:
In[13]: Q_inv=Q.inv()
Out[13]: [-sin(theta1)**2/cos(theta1) + 1/cos(theta1), sin(theta1), 0, 0]
[ -sin(theta1), cos(theta1), 0, 0]
[ 0, 0, 1, -980]
[ 0, 0, 0, 1]
Run Code Online (Sandbox Code Playgroud)
当我应该得到的是:
Out[X]: [cos(theta1), sin(theta1), 0, 0]
[-sin(theta1), cos(theta1), 0, 0]
[ 0, 0, 1, -980]
[ 0, 0, 0, 1]
Run Code Online (Sandbox Code Playgroud)
关于这里可能出现什么问题的任何想法?
有没有办法在 sympy 中使 Symbol 非零?例如,如果我集成:
psi = a * cos( sqrt(2/mu)*x ) + b * sin( sqrt(2/mu)*x )
Psi = integrate(psi, x)
Run Code Online (Sandbox Code Playgroud)
它给了我两个结果,一个是 mu == 0,一个是 mu != 0。我只需要第二个。
我有4个输入变量(浮点数):
我想为s解决以下(相当长的)等式:
> (1/2+1/2*erf((log(Xmax)-(log(mode)+s**2))/(sqrt(2)*s))-(1/2+1/2*erf((log(Xmin)-(log(mode)+s**2))/(sqrt(2)*s))) - percentage == 0
Run Code Online (Sandbox Code Playgroud)
我想用mpmath和sympy来解决这个等式,但它给了我以下错误信息:
TypeError:无法从0.707106781186547*( - s**2 - 0.287682072451781)/ s创建mpf
我的代码如下:
from mpmath import erf, log, sqrt
from sympy import Symbol, solveset, S
percentage = 0.95
mode = 2
Xmin = 1.
Xmax = 1.5
s = Symbol('s')
eqn = (1/2+1/2*erf((log(Xmax)-(log(mode)+s**2))/(sqrt(2)*s))-(1/2+1/2*erf((log(Xmin)-(log(mode)+s**2))/(sqrt(2)*s))) - percentage)
solveset(eqn, s, domain=S.Reals)
Run Code Online (Sandbox Code Playgroud)
mpf是mpmath创建的float类型.
我想我把问题缩小到erf()函数,它返回
EmptySet()
Run Code Online (Sandbox Code Playgroud)
当我跑
solveset(log(Xmax) - (log(mode) + s ** 2), s, domain=S.Reals)
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚下一步该尝试什么,任何帮助将不胜感激!
我最初认为这是数学问题,但是方程式在matlab中成功解决,所以问题可能来自于sympy或者mpmath.
在这里,pypy 计算速度较慢,无论给定数字是否为素数:
C:\Users\User>python -m timeit -n10 -s"from sympy import isprime" "isprime(2**521-1)"
10 loops, best of 3: 25.9 msec per loop
C:\Users\User>pypy -m timeit -n10 -s"from sympy import isprime" "isprime(2**521-1)"
10 loops, best of 3: 97.9 msec per loop
Run Code Online (Sandbox Code Playgroud)
在这里,pypy 在创建素数列表(从 1 到 1000000)时更快:
C:\Users\User>pypy -m timeit -n10 -s"from sympy import sieve" "primes = list(sieve.primerange(1, 10**6))"
10 loops, best of 3: 2.12 msec per loop
C:\Users\User>python -m timeit -n10 -s"from sympy import sieve" "primes = list(sieve.primerange(1, 10**6))"
10 loops, best of …Run Code Online (Sandbox Code Playgroud) 我有一个这样的表达式,由 Sympy 计算:
-1.0*pi*(-1.0*sin(1.0*t) - 0.025*cos(1.0*t) + 4.0*cos(2.0*t))
Run Code Online (Sandbox Code Playgroud)
然后我尝试了很多为简化表达而提供的选项,但它们并没有太大作用。
当我使用时expand_trig(),它返回:
pi*(1.0*sin(1.0*t) + 0.025*cos(1.0*t) - 4.0*cos(2.0*t))
Run Code Online (Sandbox Code Playgroud)
但是当我使用 Mathematica 时,它返回:
-25.0542 Cos t + 3.14159 Sin t
Run Code Online (Sandbox Code Playgroud)
如何使用 Python 获得像 Mathematica 这样的结果?如果我想进一步简化 Mathematica 给出的表达式,我该怎么办?
让我们假设我们有两个列表:
variables = ['a','b','c'...]
values = [1,2,3...]
Run Code Online (Sandbox Code Playgroud)
和一个简单的产品功能:
function = 'a*b*c*...*z'
Run Code Online (Sandbox Code Playgroud)
我尝试过这种方式(我确实意识到这是100%不正确的,但是我不知道如何将多个变量替换为简化的表达式):
import sympy
y = sympy.sympify(function).evalf(subs={variable:values})
Run Code Online (Sandbox Code Playgroud) 我想通过完成平方来分解方程式:
>>>> import sympy
>>>> x, c = symbols('x c')
>>>> factor(x**2 - 4*x - 1)
x**2 - 4*x - 1
Run Code Online (Sandbox Code Playgroud)
但是,我期望看到:
(x - 2)**2 - 5
Run Code Online (Sandbox Code Playgroud)
如何在sympy中完成?
假设我导入以下两个模块如下:
from sympy import *
from numpy import *
Run Code Online (Sandbox Code Playgroud)
两个模块都exp()定义了一个功能.python如何选择使用哪一个?有没有办法在上面导入模块后区分这些功能?在这种情况下,有什么机制可以警告用户?考虑以下一组命令IDLE
=============================== RESTART: Shell ===============================
>>> from sympy import *
>>> from numpy import *
>>> exp(5)
148.4131591025766
>>> c = symbols('c')
>>> exp(c)
Traceback (most recent call last):
File "<pyshell#162>", line 1, in <module>
exp(c)
AttributeError: 'Symbol' object has no attribute 'exp'
>>>
=============================== RESTART: Shell ===============================
>>> from sympy import *
>>> c = symbols('c')
>>> exp(c)
exp(c)
Run Code Online (Sandbox Code Playgroud)
看来默认情况下 python使用了exp()定义,numpy但是当它被一个被sympy …
我有一个包含多个变量的表达式,让我们说如下:
import numpy as np
import sympy as sym
from sympy import Symbol, Add, re, lambdify
x = sym.Symbol('x')
y = sym.Symbol('y')
z = sym.Symbol('z')
F = x+ y +z
Run Code Online (Sandbox Code Playgroud)
我有如下三个变量列表:
x = [3, 2 ,3]
y = [4, 5 , 6]
z = [7, 10 ,3]
Run Code Online (Sandbox Code Playgroud)
我想为变量的每个元素评估函数。我知道我可以定义如下内容:
f_dis = lambdify([x, y, z], x + y + z, 'numpy')
d = f_dis(3, 4, 7)
print ( "f_dis =", d)
Run Code Online (Sandbox Code Playgroud)
这给了我14个理想的结果。但是如何将x,y和z作为三个列表传递(而不是分别编写元素),并得到如下结果:
[14, 17, 12]
Run Code Online (Sandbox Code Playgroud)
根据以下说明,使用lambdify似乎是评估函数的更有效方法:https ://www.sympy.org/scipy-2017-codegen-tutorial/notebooks/22-lambdify.html
谢谢。