如何解决带有符号方程的python smypy / matplotlib输入输出
该程序用于绘制形状(解决I / O问题后)。
我使用了之前编写的程序中的模板来实现此目的,但是我似乎在这里缺少了一些东西。我曾尝试过该程序和故障排除,但无法弄清楚。打印声明纯粹是我进行故障排除时的工作。
预期的功能是为该函数提供一个numpy数组,它还将根据数组返回适当的X和Y值。
import sympy as sy
import numpy as np
def rose_func(thetarange):
_theta = thetarange
r,x,y,theta = sy.symbols('r,theta')
rose_eq = ((((x ** 2 + y ** 2) ** sy.Rational(7 / 2)) + 6 * (
3 * (x ** 5 * y + x * y ** 5) - 10 * x ** 3 * y ** 3)) / (x ** 2 + y ** 2) ** 3) - 1
sub_rose = rose_eq.subs([(x,r * sy.cos(thetarange)),(y,r * sy.sin(thetarange))])
print("subbed eq:",sub_rose)
print("subbed eq:",sy.latex(sub_rose))
print()
simp_rose = sy.simplify(sub_rose)
print("simplified eq:",simp_rose)
print("simplified eq:",sy.latex(simp_rose))
print()
solv_rose = sy.solve(simp_rose,r)
print("Solved eq:",solv_rose)
print("Solved eq:",sy.latex(solv_rose))
print()
X = sy.lambdify('r',solv_rose*(int(sy.cos(_theta))),"numpy") #may need to multiply by r(theta) or theta again
Y = sy.lambdify('r',solv_rose*(int(sy.sin(_theta))),"numpy") #may need to multiply by r(theta) or theta again
return X(_theta),Y(_theta)
thetavar = np.linspace(-3.14 * 2,3.14 * 2,250)
rose_func(thetavar)
我基于以下程序创建的有效“模板”:
def mac_ser(x,N):
_x = x
n,z,x = sy.symbols('n,x')
my_equation = sy.summation((z ** n / sy.factorial(n)),(n,N))
sub_eq = my_equation.subs([(z,-x ** 2)])
mac_lam = (sy.lambdify('x',sub_eq,"numpy"))
print("Mac test",mac_lam)
print("Type is:",type(mac_lam(_x)))
return (mac_lam(_x))
x = np.linspace(-2,2,1000)
test = mac_ser(x,2)
这是我当前的错误:
File "C:\Users\...\venv\lib\site-packages\sympy\core\cache.py",line 94,in wrapper
retval = cfunc(*args,**kwargs)
TypeError: unhashable type: 'numpy.ndarray'
During handling of the above exception,another exception occurred:
Traceback (most recent call last):
File "C:\Users\...\venv\lib\site-packages\sympy\core\cache.py",another exception occurred:
Traceback (most recent call last):
File "C:/Users/.../Roaming/JetBrains/PyCharmCE2020.2/scratches/scratch_21.py",line 51,in <module>
rose_func(thetavar)
File "C:/Users/.../Roaming/JetBrains/PyCharmCE2020.2/scratches/scratch_21.py",line 15,in rose_func
sub_rose = rose_eq.subs([(x,File "C:\Users\...\venv\lib\site-packages\sympy\core\cache.py",line 96,in wrapper
retval = func(*args,**kwargs)
File "C:\Users\...\venv\lib\site-packages\sympy\core\function.py",line 465,in __new__
result = super().__new__(cls,*args,**options)
File "C:\Users\...\venv\lib\site-packages\sympy\core\cache.py",line 280,in __new__
evaluated = cls.eval(*args)
File "C:\Users\...\venv\lib\site-packages\sympy\functions\elementary\trigonometric.py",line 570,in eval
if arg.Could_extract_minus_sign():
AttributeError: 'ImmutableDenseNDimArray' object has no attribute 'Could_extract_minus_sign'```
解决方法
人们似乎很难同时使用numpy和sympy。请记住,numpy不知道sympy存在,并且sympy不喜欢基于numpy的输入。除非您是这两者的专家,否则请不要尝试交替使用它们。请使用标签sympy
查看堆栈溢出的每三个问题,以了解类似的问题并获得理解。
我发现您的代码存在3个主要问题:
- sympy函数liek
sy.sin
不接受numpy数组。您必须给它提供纯python对象(例如ints或sympy对象)。 -
sy.solve
根据您的情况返回2个解决方案。您需要通过进行类似sy.solve(...)[0]
的操作来选择其中一个,以获得第一个解决方案。 -
sy.lambdify
我认为不适合将字符串作为其第一个参数。使用开始时创建的符号。它也是theta
的功能,而不是r
的功能。
这是更正,我清楚地将sympy部分和numpy部分分开。
import numpy as np
def generate_rose_func():
"""
Generates the lambdifed expressions.
No numpy allowed in this function.
No sympy allowed out of this function.
"""
import sympy as sy
r,x,y,theta = sy.symbols('r,theta')
rose_eq = ((((x ** 2 + y ** 2) ** sy.Rational(7 / 2)) + 6 * (
3 * (x ** 5 * y + x * y ** 5) - 10 * x ** 3 * y ** 3)) / (x ** 2 + y ** 2) ** 3) - 1
sub_rose = rose_eq.subs([(x,r * sy.cos(theta)),(y,r * sy.sin(theta))])
print("subbed eq:",sub_rose)
print("subbed eq:",sy.latex(sub_rose))
print()
simp_rose = sy.simplify(sub_rose)
print("simplified eq:",simp_rose)
print("simplified eq:",sy.latex(simp_rose))
print()
solv_rose = sy.solve(simp_rose,r)[0] # solve returns 2 solutions in this case. Pick the first one
print("Solved eq:",solv_rose)
print("Solved eq:",sy.latex(solv_rose))
print()
X = sy.lambdify(theta,solv_rose * sy.cos(theta),"numpy") # may need to multiply by r(theta) or theta again
Y = sy.lambdify(theta,solv_rose * sy.sin(theta),"numpy") # may need to multiply by r(theta) or theta again
return X,Y
def rose_func(thetarange):
X,Y = generate_rose_func()
return X(thetarange),Y(thetarange)
thetavar = np.linspace(-3.14 * 2,3.14 * 2,250)
print(rose_func(thetavar))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。