【发布时间】:2018-11-16 23:04:32
【问题描述】:
我创建了一个class capacity,它通过for-loop 迭代valuex 来进行一些计算。计算过程没有任何问题。当这个条件匹配时,我只需要打破或停止方程。
self.Nrd= Ned
为了获得上述结果,我创建了以下条件,
e=float(Nrd)-Ned
if e>= 0 and e<=1:
break
但这并不能产生一个好的和令人满意的结果,更好的说法是不能真正正常工作。
我希望你能帮我解决这个问题,在达到 Nrd = Ned 条件时停止等式。
第二个问题,我使用__str__ 方法并没有真正得到任何回报。值如何返回?
代码:
import numpy as np
from PyQt5 import QtCore, QtGui, QtWidgets
class capacity:
def __init__(self,b,h,y,ecu,cb,ct,fyd,fcd,Esd,Ned):
d = h - cb
ds = ct
Ast = int(3.1416/4*(y)**2*6.67)
Asb = int(3.1416/4*(y)**2*6.67)
for x in np.linspace(1,h,10000):
esc=ecu/x*(ds-x)
es=ecu/x*(d-x)
sisc=Esd*esc
sis=min(Esd*es,fyd)
if sisc <= -fyd:
sisc=-fyd
elif sisc >= -fyd and sisc < 0:
sisc= sisc
else:
sisc=min(sisc,fyd)
self.Nrd=int((0.8*x*b*fcd+Ast*sisc-Asb*sis)/1000)
self.Mrd=(0.8*x*b*fcd*(h/2-0.4*x)+Ast*sisc*(h/2-ds)+Asb*sis*(d-h/2))/1000000
self.x = x
e=float(Nrd)-Ned
if e>= 0 and e<=1:
break
if x==h and Nrd != Ned:
print('Errors','Compression over whole section', sep=' ')
app = QtWidgets.QApplication([])
error_dialog = QtWidgets.QErrorMessage()
error_dialog.showMessage('Increase size of column, compressed reinforced column!!')
app.exec_()
def __str__(self):
return print(self.x , self.Nrd, self.Mrd)
foo = capacity(b= 300,h=300,y=12,ecu= 0.0035,cb=35,ct=35,fyd=435,fcd=20,Esd=2e5,Ned=1000)
感谢您的帮助,欢迎您改进代码。谢谢
代码更新:
根据上面代码的最新参数,我设法定义了一个执行计算的函数,但我想问的问题是,如何在 python 中将它实现为一个类。获得与按功能显示相同的打印效果。
def capacity(b,h,y,ecu,cb,ct,fyd,fcd,Esd,Ned):
d = h - cb
ds = ct
Ast = int(3.1416/4*(y)**2*6.67)
Asb = int(3.1416/4*(y)**2*6.67)
for x in np.linspace(1,h,10000):
try:
esc=ecu/x*(ds-x)
es=ecu/x*(d-x)
except (ZeroDivisionError, RuntimeWarning):
esc = 0
es = 0
sisc=Esd*esc
sis=min(Esd*es,fyd)
if sisc <= -fyd:
sisc=fyd
elif sisc >= -fyd and sisc < 0:
sisc= sisc
else:
sisc=min(sisc,fyd)
Nrd=int((0.8*x*b*fcd+Ast*sisc-Asb*sis)/1000)
Mrd=(0.8*x*b*fcd*(h/2-0.4*x)+Ast*sisc*(h/2-ds)+Asb*sis*(d-h/2))/1000000
e=float(Nrd)-float(Ned)
if e>= 0 and e<=0.5:
return print('\n','x value:', x,'\n' ,'Normalforce: ', Nrd,'\n','Moment capacity :', Mrd,'\n','Bottom steel strain :',es,'\n',
'Top steel strain :', esc,'\n', 'Bottom steel stress :', sisc,'\n','Top steel stress :' ,sis )
break
if x==h and Nrd != Ned:
print('Errors','Tryk over hele tværsnit', sep=' ')
app = QtWidgets.QApplication([])
error_dialog = QtWidgets.QErrorMessage()
error_dialog.showMessage('Increase size of column, compressed reinforced column!!')
app.exec_()
return print(x, Nrd, Mrd)
foo = Capacity(b= 300,h=250,y=12,ecu= 0.0035,cb=50,ct=50,fyd=435,fcd=20,Esd=2e5,Ned=800)
结果:
【问题讨论】:
-
print()不返回任何内容。__str__需要返回一个格式化字符串,类似于{}, {}.format(self.Nrd, self.Mrd)`(我省略了x,它不是参数或属性。__init__应该设置一些属性,像这样Nrd。定义另一个方法来实际进行计算。进一步考虑,也许你甚至不需要定义一个类;而是定义一个函数。 -
我和你想的一样定义一个函数并返回值。你是对的,
__str__returns 字符串。但这些值是int。关于x值我已在上面的代码中修复。 python中是否存在__int__方法? -
我不明白您为什么要以这种方式构建中断条件。 Nrd 和 Ned 似乎都是整数。如果 Nrd==Ned: break 有什么问题?
-
如果 Nrd = Ned : 中断,有时不要停止或中断,例如如果 Ned = 800,Nrd 将达到 800,0023 或 800,1000 不会中断,原因我更喜欢小数,因为 x 值想要准确地说。
-
当你
break时,设置某种flag变量,所以很明显你提前退出了。这样你就不必在之后测试x==h。
标签: python python-3.x class numpy for-loop