我昨天问了一个问题关于区分python函数的问题,然后当我发现张贴的答案都不能满足我对某些变量的求值(然后绘制导数)的需要时,我便能找到自己的解决方案。
import sympy as sym
import math
def f(x,y):
return x**2 + x*y**2
x, y = sym.symbols('x y')
def fprime(x,y):
return sym.diff(f(x,y),x)
print(fprime(x,y)) #This works.
print(fprime(1,1))
Run Code Online (Sandbox Code Playgroud)
import sympy as sym
import math
def f(x,y):
return x**2 + x*y**2
x, y = sym.symbols('x y')
def fprime(x,y):
return sym.diff(f(x,y),x)
print(fprime(x,y)) #This works.
DerivativeOfF = sym.lambdify((x,y),fprime(x,y),"numpy")
print(DerivativeOfF(1,1))
Run Code Online (Sandbox Code Playgroud)
如您所见,我通过创建新函数DerivativeOfF克服了无法评估派生fprime的功能,该函数是fprime的“ lambdified”版本。从那里,我能够评估DerivativeOfF,并将其绘制在变量之一中。
我的问题是:为什么要这样做?我到底做了什么?这种方法有什么缺点?我曾尝试阅读过lambdify文档,但对我来说却非常混乱(我是Python的初学者)。我的猜测是我将Python函数fprime转换为Sympy表达式DerivativeOfF或类似的东西。任何帮助解释发生了什么事,为什么发生以及lambdify所做的事情(以外行的术语)的帮助,将不胜感激。
我想对功能进行羔羊化Integral(t**t,(t,0,x))
。它可以工作,但是我的新函数(由返回)lambdify
不返回数字,而仅返回sympy.integrals.integrals.Integral
类。但是我不希望那样,我希望它返回一个浮点数。
这是我的代码:
import sympy as sp
import numpy as np
f = sp.lambdify(x,sp.integrate(t**t,(t,0,x)))
print(f(2)) #return Integral(t**t, (t, 0, 2))
#but i want 2.83387674524687
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 sympy 进行偏导数,我想将其转换为函数,以便我可以替换值并估计 t_1、t_2 的某些值的导数。我使用的代码如下:
import sympy as sp
import numpy as np
from sympy import init_printing
init_printing()
t_1,t_2,X_1,X_2,Y_1,Y_2,X_c1,X_c2,Y_c1,Y_c2,a_1,a_2,psi_1,psi_2,b_1,b_2= sp.symbols('t_1 t_2 X_1 X_2 Y_1 Y_2 X_c1 X_c2 Y_c1 Y_c2 a_1 a_2 psi_1 psi_2 b_1 b_2')
X_1=X_c1 + (a_1 * sp.cos(t_1) * sp.cos(psi_1)) - ((b_1) * sp.sin(t_1)* sp.sin(psi_1))
X_2=X_c2 + (a_2 * sp.cos(t_2) * sp.cos(psi_2)) - ((b_2) * sp.sin(t_2)* sp.sin(psi_2))
Y_1=Y_c1 + (a_1 * sp.cos(t_1) * sp.sin(psi_1)) + ((b_1) * sp.sin(t_1)* sp.cos(psi_1))
Y_2=Y_c2 + (a_2 * sp.cos(t_2) * sp.sin(psi_2)) + ((b_2) …
Run Code Online (Sandbox Code Playgroud) from sympy import *
x = Symbol('x')
y = x ** 2
dx = diff(y, x)
Run Code Online (Sandbox Code Playgroud)
这段代码可以得到y的导数。这很容易dx = 2 * x
dx
现在我想获取for的值x = 2
。
显然,dx = 2 * 2 = 4
当x = 2
但是我如何用Python代码实现这一点呢?
感谢您的帮助!
下面的 python 脚本计算表达式中的第一项, 4.939e-3xAxB+8.7989 at (A,B) = (1.0,1.0):
import sympy
from sympy import *
A = sympy.Symbol(A)
B = sympy.Symbol(B)
F = 4.939e-3*A*B+8.7989
G = str(F).split("+")[0]
H = lambdify([A,B], G, "numpy")
print H(1,1)
Run Code Online (Sandbox Code Playgroud)
输出为:0.004939
现在下面的代码旨在实现相同的目标:
A = sympy.Symbol(A)
B = sympy.Symbol(B)
F = 4.939e-3*A*B+8.7989
G = str(F).split("+")[0]
H = lambdify(A, G, "numpy")
I = lambdify(B, H(1), "numpy")
print I(1)
Run Code Online (Sandbox Code Playgroud)
但这会返回错误:
NameError: global name 'B' is not defined
有人可以解释一下吗?
我有一个包含多个变量的表达式,让我们说如下:
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
谢谢。
lambdify ×6
sympy ×6
python ×5
numpy ×3
python-3.x ×2
derivative ×1
function ×1
integral ×1
symbols ×1