如何克服替换符号时的 SympifyError?

问题描述 投票:0回答:1

我正在尝试替换 sympy 中的符号并获得一个浮点数作为方程组的结果。

主要目标是输入不同的力(f1,f1,...)及其与 x 轴的角度并计算合力。因此我需要一个方程组然后求解它。因为这是为了学校,我需要知道公式而不仅仅是结果。

我尝试隔离问题,但隔离后似乎效果很好。

from sympy import *

f1, f2, f3 = symbols(['f1', 'f2', 'f3'])

# Result of other calcuations
x_dir = sqrt(2)*f1/2 - f2 + sqrt(3)*f3/2


x_dir = x_dir.subs([(f1, 5), (f2, 3), (f3, 4)])
print(x_dir)

在更大的上下文中,相同的代码会导致 SympifyError。

from sympy import *
from math import radians

# ===== Berechnungen im 2D-Raum ======

# == Definiere alle Kräfte ==
# Name der Kraft (Variable), Winkel von ---> x-Achse in positive Richtung (nach oben positiv, nach unten negativ)

Rx = Symbol('Rx')
Ry = Symbol('Ry')

# fg = [symbols('fg'), -90]
f1 = [Symbol('f1'), 45]
f2 = [Symbol('f2'), 180]
f3 = [Symbol('f3'), -30]

all_forces = [f1, f2, f3]


def forces_to_equations(all_forces):
    x_dir = []
    y_dir = []
    for force in all_forces:
        vec_force = kraft_winkel_zu_vektor(force[0], force[1])
        x_dir.append(vec_force[0])
        y_dir.append(vec_force[1])
    
    x_dir = sum(x_dir)
    y_dir = sum(y_dir)

    return x_dir, y_dir
        

def deg_to_rad(alpha):
    alpha = alpha%360
    deg = [30, 45, 60, 90, 120, 135, 150, 180, 210, 225, 240, 270, 300, 315, 330, 360]
    rad = [pi/6, pi/4, pi/3, pi/2, 2*pi/3, 3*pi/4, 5*pi/6, pi, 7*pi/6, 5*pi/4, 4*pi/5, 3*pi/2, 5*pi/3, 7*pi/4, 11*pi/6, 2*pi]
    if alpha in deg:
        angle = rad[deg.index(alpha)]
    
    else:
        angle = radians(alpha)
    return angle


def kraft_winkel_zu_vektor(force, alpha):
    vec = [force*cos(deg_to_rad(alpha)), force*sin(deg_to_rad(alpha))]
    return vec


x_dir, y_dir = forces_to_equations(all_forces)

print(solve([x_dir-Rx, y_dir-Ry], [Rx, Ry]))


# ===== This is causing an SympifyError ======
x_dir = x_dir.subs([(f1, 5), (f2, 3), (f3, 4)])


print(solve([x_dir-Rx, y_dir-Ry], [Rx, Ry]))

有什么想法可以解决这个问题吗?

python sympy
1个回答
0
投票

在“更大”的上下文中,您从未将

f1
f2
f3
定义为符号(就像您在第一个示例中所做的那样)。它们是带有符号和数字的列表。

一个快速解决方法是在您需要它的行之前执行此操作:

f1, f2, f3 = symbols(['f1', 'f2', 'f3'])
x_dir = x_dir.subs([(f1, 5), (f2, 3), (f3, 4)])

print(solve([x_dir-Rx, y_dir-Ry], [Rx, Ry]))

您将获得所需的输出。

© www.soinside.com 2019 - 2024. All rights reserved.