SymPy报错'Symbol' object is not callable 求助代码排查
解决SymPy中'Symbol' object is not callable错误
嘿,我一眼就看出你遇到的问题啦——这是Python里很容易踩的小坑:乘法符号*绝对不能省略!
错误原因
你定义的l、a、p这些都是SymPy的Symbol对象,在代码里像l(x2 + l)、a(3 * l + x3)这种写法,会被Python当成「调用名为l或a的函数」,但它们根本不是函数,所以才会抛出TypeError: 'Symbol' object is not callable的错误。
修正方案
所有你想表示「符号和括号里的表达式相乘」的地方,都必须显式加上*。我帮你把所有出错的地方都修正了,同时也调整了部分表达式的括号来避免优先级歧义,还顺手改了一个小笔误:
from __future__ import division from sympy import * q, l, p = symbols('q, l, p') x1, x2, x3, x4, x5, x6, x7 = symbols('x1, x2, x3, x4, x5, x6, x7') c1, c2, c3, c4, c5, c6, c7 = symbols('c1, c2, c3, c4, c5, c6, c7') c8, c9, c10, c11, c12, c13, c14 = symbols('c8, c9, c10, c11, c12, c13, c14') a = 209 * q * l / 42 - p / 3 "TRECHO AB" m1 = a * x1 - q * x1 ** 2 / 2 d1 = integrate(m1, x1) + c1 y1 = integrate(d1, x1) + c2 "TRECHO BC" # 修正:l(x2+l) → l*(x2+l) m2 = a * 2 * l + a * x2 - 2 * q * l * (x2 + l) d2 = integrate(m2, x2) + c3 y2 = integrate(d2, x2) + c4 "TRECHO CD" # 修正:a(3l+x3)→a*(3l+x3),l(2l+x3)→l*(2l+x3),调整x³项的括号避免歧义 m3 = a * (3 * l + x3) - 2 * q * l * (2 * l + x3) - q * x3 ** 3 / (6 * l) d3 = integrate(m3, x3) + c5 y3 = integrate(d3, x3) + c6 "TRECHO DE" # 修正:a(x4+6l)→a*(x4+6l),l(x4+5l)→l*(x4+5l),(9ql/2)(x4+l)→(9ql/2)*(x4+l) # 笔误修正:原本的integrate(d3, x4)改成integrate(d4, x4) m4 = a * (x4 + 6 * l) - 2 * q * l * (x4 + 5 * l) - (9 * q * l / 2) * (x4 + l) d4 = integrate(m4, x4) + c7 y4 = integrate(d4, x4) + c8 "TRECHO FG" # 修正:a(x5+7l)→a*(x5+7l),l(x5+6l)→l*(x5+6l),(9ql/2)(x5+2l)→(9ql/2)*(x5+2l) m5 = a * (x5 + 7 * l) - 2 * q * l * (x5 + 6 * l) - (9 * q * l / 2) * (x5 + 2 * l) - p * x5 d5 = integrate(m5, x5) + c9 y5 = integrate(d5, x5) + c10 "TRECHO GH" # 修正所有符号与括号表达式的乘法,补充* m6 = a * (x6 + 15 * l / 2) - 2 * q * l * (x6 + 13 * l / 2) - (9 * q * l / 2) * (x6 + 5 * l / 2) - p * (x6 + l / 2) - 2 * q * x6 * (x6 / 2) d6 = integrate(m6, x6) + c11 y6 = integrate(d6, x6) + c12 "TRECHO HI" # 修正所有乘法省略的问题,调整x³项的括号 m7 = a * (x7 + 19 * l / 2) - 2 * q * l * (x7 + 17 * l / 2) - (9 * q * l / 2) * (x7 + 9 * l / 2) - p * (x7 + 5 * l / 2) - 4 * q * l * (x7 + l) - (3 * q * x7 ** 2 / (2 * l)) * (x7 / 3) d7 = integrate(m7, x7) + c13 y7 = integrate(d7, x7) + c14 print( "{},{},{},{},{},{},{},{},{},{},{},{},{},{}".format(d1, y1, d2, y2, d3, y3, d4, y4, d5, y5, d6, y6, d7, y7))
小提示
在Python(包括SymPy)里,永远不要省略乘法符号,哪怕是符号和括号、符号和数字之间也不行,必须用*明确表示乘法关系——这和我们手写数学公式的习惯不一样,得多留意~
内容的提问来源于stack exchange,提问作者ldsm25
相关产品推荐
相关产品推荐

