python smypy/matplotlib输入输出和符号方程

python smypy/matplotlib输入输出和符号方程,python,numpy,sympy,Python,Numpy,Sympy,此程序用于绘制图形(I/O问题解决后) 我使用了我以前编写的一个程序中的一个模板来制作这个,但我似乎遗漏了一些东西。我尝试过通过程序和故障排除,但一直无法解决它。打印语句纯粹是我在排除故障方面所做的努力 预期的功能是向函数提供一个numpy数组,它还将返回相应的X和Y值(以数组形式) import sympy as sy import numpy as np def rose_func(thetarange): _theta = thetarange r, x, y, th

此程序用于绘制图形(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, x, y, 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, z, x')
    my_equation = sy.summation((z ** n / sy.factorial(n)), (n, 0, 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", 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/.../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, r * sy.cos(thetarange)),
  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 96, in wrapper
    retval = func(*args, **kwargs)
  File "C:\Users\...\venv\lib\site-packages\sympy\core\function.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'```
文件“C:\Users\…\venv\lib\site packages\sympy\core\cache.py”,第94行,在包装器中
retval=cfunc(*args,**kwargs)
TypeError:不可损坏的类型:“numpy.ndarray”
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“C:\Users\…\venv\lib\site packages\sympy\core\cache.py”,第94行,在包装器中
retval=cfunc(*args,**kwargs)
TypeError:不可损坏的类型:“numpy.ndarray”
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“C:/Users/../Roaming/JetBrains/PyCharmCE2020.2/scratches/scratch_21.py”,第51行,in
rose_func(thetavar)
文件“C:/Users/../Roaming/JetBrains/PyCharmCE2020.2/scratches/scratch_21.py”,第15行,在rose_func中
sub_rose=rose eq.subs([(x,r*sy.cos(thetarange)),
文件“C:\Users\…\venv\lib\site packages\sympy\core\cache.py”,第96行,在包装器中
retval=func(*args,**kwargs)
文件“C:\Users\…\venv\lib\site packages\sympy\core\function.py”,第465行,新__
结果=超级()。\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
文件“C:\Users\…\venv\lib\site packages\sympy\core\cache.py”,第96行,在包装器中
retval=func(*args,**kwargs)
文件“C:\Users\…\venv\lib\site packages\sympy\core\function.py”,第280行,新__
已评估=cls.eval(*args)
文件“C:\Users\…\venv\lib\site packages\sympy\functions\elementary\trigonal.py”,第570行,在eval中
如果参数可以提取负号():
AttributeError:“ImmutableDenseNDimArray”对象没有属性“无法提取负号”```

人们很难同时使用numpy和sympy,这似乎是一种常见现象。请记住,numpy不知道sympy的存在,并且sympy不喜欢基于numpy的输入。除非您是这两方面的专家,否则请不要尝试交替使用它们。请参阅有关堆栈溢出的第三个问题标记
sympy
,查看类似问题并获得理解

我发现您的代码存在3个主要问题:

  • symphy函数liek
    sy.sin
    不接受numpy数组。必须为它提供纯python对象,如int或symphy对象
  • sy.solve
    在您的案例中返回两个解决方案。您需要通过执行类似于
    sy.solve(…)[0]
    的操作来选择其中一个,以获得第一个解决方案
  • sy.lambdify
    我认为使用字符串作为第一个参数并不合适。请使用您在开始时创建的符号。它也是
    theta
    的函数,而不是
    r
    的函数
  • 这是更正,我已经清楚地将sympy部分和numpy部分分开了

    将numpy导入为np
    def generate_rose_func():
    """
    生成lambdifed表达式。
    此函数中不允许有numpy。
    此函数不允许使用任何符号。
    """
    将sympy作为sy导入
    r、 x,y,θ=sy.符号('r,x,y,θ'))
    罗斯方程=(((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(θ)),
    (y,r*sy.sin(θ)))
    打印(“子床eq:,子床玫瑰色)
    打印(“子床eq:,sy.乳胶(子床玫瑰))
    打印()
    simp_rose=sy.simplify(sub_rose)
    打印(“简化等式:”,simp_-rose)
    打印(“简化公式:,sy.latex(simp_rose))
    打印()
    solv_rose=sy.solve(simp_rose,r)[0]#在这种情况下,solve返回两个解决方案。选择第一个
    打印(“已解决的等式:”,solv_rose)
    打印(“已解决的等式:,sy.乳胶(solv_rose))
    打印()
    X=sy.lambdify(θ,solv_rose*sy.cos(θ),“numpy”)#可能需要再次乘以r(θ)或θ
    Y=sy.lambdify(θ,solv_rose*sy.sin(θ),“numpy”)#可能需要再次乘以r(θ)或θ
    返回X,Y
    def rose_func(行程):
    十、 Y=生成函数()
    返回X(thetarange),Y(thetarange)
    thetavar=np.linspace(-3.14*2,3.14*2250)
    打印(rose_func(thetavar))
    
    在对表达式进行lambdify之前,不能在numpy数组中使用subs。@OscarBenjamin,我在lambdify之前使用subs的地方添加了基于此的函数。它应该是
    cos(theta)
    而不是
    cos(thetarange)
    @OscarBenjamin,谢谢,我已经更正了。我已经看了好几天了,我已经交换了很多东西试图找出它。我仍然在主要帖子中列出了错误。非常感谢,它确实有效,我现在能够将它绘制出来。我完全误解了我应该怎么做和做什么冒充