import pandas as pd
import math
from sympy import *
xlsx = pd.read_excel(r'v_data.xlsx', nrows=19, usecols='A:V')
groups = xlsx.groupby(xlsx.柱类型)
xlsx_r = groups.get_group('方柱')
xlsx_c = groups.get_group('圆柱')
def csct_r(xlsx_r):
fy = xlsx_r['纵筋屈服强度']
dg = xlsx_r['最大骨料粒径']
fcc = xlsx_r['fcc']
d = xlsx_r['柱边长']
h0 = xlsx_r['板有效高度']
dg0 = 16
Es = 2e5
rc = 0.5 * xlsx_r['柱边长']
rs = rq = xlsx_r['板边长']
um = (xlsx_r['柱边长'] + xlsx_r['板有效高度']) * 4
mr = (xlsx_r['配筋率'] * xlsx_r['纵筋屈服强度'] * xlsx_r['板有效高度'] * xlsx_r['板有效高度']
* (1-xlsx_r['配筋率']*xlsx_r['纵筋屈服强度']/(2*xlsx_r['fcc'])))
vflex = 2 * 3.14 * mr * rs / (rq - rc)
x = Symbol('x')#x=Vr-抗剪承载力
y = Symbol('y')#y=f-转角
solved_value = solve([y-1.5*rs*fy*pow(x,3/2)/(d*Es*pow(vflex,3/2)),x/(um*d*pow(fcc,0.5))-0.75/(1+15*y*h0/(dg0+dg))],[x,y])
xlsx_r['v'] = solved_value[0][0]
xlsx_r['f'] = solved_value[0][1]
def csct_c(xlsx_c):
fy = xlsx_c['纵筋屈服强度']
dg = xlsx_c['最大骨料粒径']
fcc = xlsx_c['fcc']
d = xlsx_c['板有效高度']
h0 = xlsx_c['板有效高度']
dg0 = 16
Es = 2e5
rc = 0.5 * xlsx_c['柱边长']
rs = xlsx_c['板边长'] * 0.5
rq = xlsx_c['板边长'] * 0.5
um = (xlsx_c['柱边长'] + xlsx_c['板有效高度']) * 4
mr = (xlsx_c['配筋率'] * xlsx_c['纵筋屈服强度'] * xlsx_c['板有效高度'] * xlsx_c['板有效高度']
* (1-xlsx_c['配筋率']*xlsx_c['纵筋屈服强度']/(2*xlsx_c['fcc'])))
vflex = 2 * 3.14 * mr * rs / (rq - rc)
x = Symbol('x')#x=Vr-抗剪承载力
y = Symbol('y')#y=f-转角
solved_value = solve([y-1.5*rs*fy*pow(x,3/2)/(d*Es*pow(vflex,3/2)),x/(um*d*pow(fcc,0.5))-0.75/(1+15*y*h0/(dg0+dg))],[x,y])
xlsx_r['v'] = solved_value[0][0]
xlsx_r['f'] = solved_value[0][1]
print(csct_r(xlsx_r), csct_c(xlsx_c))
xlsx_csct = pd.concat([xlsx_r, xlsx_c], axis=0)
结果报错
File "F:\anaconda\lib\site-packages\sympy\solvers\solvers.py", line 908, in solve
if fi.is_Relational:
File "F:\anaconda\lib\site-packages\pandas\core\generic.py", line 5465, in getattr
return object.getattribute(self, name)
AttributeError: 'Series' object has no attribute 'is_Relational'
谁知道是为啥吗?
这个错误的原因是在使用sympy库的solve函数时出现问题,可能是由于其中的一个方程不是关系式。解决这个问题的方法是检查方程是否正确,并确保所有输入变量都已定义。同时,您还可以尝试使用其他求解器(如fsolve)来解决方程组。以下是一个例子:
from scipy.optimize import fsolve
def equation(x):
y = x[1]
fy = xlsx_r['纵筋屈服强度']
dg = xlsx_r['最大骨料粒径']
fcc = xlsx_r['fcc']
d = xlsx_r['板有效高度']
h0 = xlsx_r['板有效高度']
dg0 = 16
Es = 2e5
rc = 0.5 * xlsx_r['柱边长']
rs = rq = xlsx_r['板边长']
um = (xlsx_r['柱边长'] + xlsx_r['板有效高度']) * 4
mr = (xlsx_r['配筋率'] * xlsx_r['纵筋屈服强度'] * xlsx_r['板有效高度'] * xlsx_r['板有效高度']
* (1-xlsx_r['配筋率']*xlsx_r['纵筋屈服强度']/(2*xlsx_r['fcc'])))
vflex = 2 * 3.14 * mr * rs / (rq - rc)
return [y-1.5*rs*fy*pow(x[0],3/2)/(d*Es*pow(vflex,3/2)),x[0]/(um*d*pow(fcc,0.5))-0.75/(1+15*y*h0/(dg0+dg))]
x0 = [1,1]
x = fsolve(equation, x0)
xlsx_r['v'] = x[0]
xlsx_r['f'] = x[1]
这里使用了fsolve来求解方程,将所有的输入变量作为参数传递给了equation函数,然后返回一个列表,其中第一个元素为Vr-抗剪承载力,第二个元素为f-转角。最后,将求解得到的Vr-抗剪承载力和f-转角分别赋值给xlsx_r的'v'和'f'列。
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
这个错误是由于你引入了 sympy 库中的 solve 函数,但是你没有引入其中的所有依赖项。具体来说,solve 函数依赖于 sympy.logic.boolalg.BooleanFunction 中的 is_Relational 方法,而 pandas 库中的 Series 对象中也有名为 is_Relational 的方法,导致了冲突。
解决办法是使用 from sympy.logic.boolalg import BooleanFunction 导入该依赖项,或者使用 from sympy.solvers import solve 而不是 from sympy import *。
另外,在你的代码中,调用 csct_r(xlsx_r) 和 csct_c(xlsx_c) 的返回值都是 None,因为这两个函数中没有显式地 return 任何东西。所以最后输出的 xlsx_csct 是空的。如果你想在这两个函数中对 xlsx_r 和 xlsx_c 进行修改,可以直接在函数内部对其进行操作,不需要返回值。或者你可以在函数中显式地使用 return 语句来返回修改后的值。
如果我的回答解决了您的问题,请采纳!