带有符号方程的python smypy / matplotlib输入输出

如何解决带有符号方程的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个主要问题:

  1. sympy函数liek sy.sin不接受numpy数组。您必须给它提供纯python对象(例如ints或sympy对象)。
  2. sy.solve根据您的情况返回2个解决方案。您需要通过进行类似sy.solve(...)[0]的操作来选择其中一个,以获得第一个解决方案。
  3. 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?