使用Python sympy求解方程符号变量时索引报错如何解决
问题原因分析
- 方程数量不足:你当前只代入了t=10的1个方程,但要解k1、k2、k3、c共4个未知数,属于欠定问题,
solve()无法得到确定的键值对形式解,返回的是参数化的解列表甚至空列表,所以直接用符号做索引或者数字索引都会报错。 Eq语法错误:Eq构造等式的正确写法是Eq(左侧表达式, 右侧值),你代码里写的Eq((k1*t)+(k2*(t**2))+(k3*(c**(0.15*t)))==25)存在语法问题,括号内的==会先执行布尔判断,不符合Eq的入参要求。- 约束缺失:你共有f(10)=25、f(15)=130、f(20)=650三个已知条件,仍然差1个约束,需要固定其中一个变量的取值范围/初始值才能得到确定解。
修正后的实现方案
如果你需要数值解,可以用nsolve做非线性数值求解,给未知数设置合理的初始猜测值即可:
from sympy import symbols, Eq, nsolve # 定义所有符号变量 k1, k2, k3, c = symbols('k1 k2 k3 c') # 代入三个已知条件构造完整方程组 eq1 = Eq(k1*10 + k2*(10**2) + k3*(c**(0.15*10)), 25) eq2 = Eq(k1*15 + k2*(15**2) + k3*(c**(0.15*15)), 130) eq3 = Eq(k1*20 + k2*(20**2) + k3*(c**(0.15*20)), 650) # 给四个变量设置初始猜测值,此处假设c为大于1的正实数、系数为普通实数 sol = nsolve((eq1, eq2, eq3), (k1, k2, k3, c), (-10, 1, 0.1, 2)) print("求解结果:") print(f"k1 = {sol[0]:.4f}") print(f"k2 = {sol[1]:.4f}") print(f"k3 = {sol[2]:.4f}") print(f"c = {sol[3]:.4f}")
如果你需要符号解,可以把c当作已知参数,再用solve求解剩下的三个k系数,此时返回结果为字典结构,可以直接用符号作为索引取值:
from sympy import symbols, Eq, solve k1, k2, k3, c = symbols('k1 k2 k3 c') eq1 = Eq(k1*10 + k2*(10**2) + k3*(c**1.5), 25) eq2 = Eq(k1*15 + k2*225 + k3*(c**2.25), 130) eq3 = Eq(k1*20 + k2*400 + k3*(c**3), 650) # 固定c为已知量,求解三个k参数 sol = solve((eq1, eq2, eq3), (k1, k2, k3)) print("k1的符号解:", sol[k1]) print("k2的符号解:", sol[k2]) print("k3的符号解:", sol[k3])
内容的提问来源于stack exchange,提问作者AFAV
相关产品推荐
相关产品推荐

