我创建了一个class capacity,它通过通过一个x迭代值x来进行一些计算。计算过程没有什么问题。我只需要打破或停止方程,当这个条件是匹配的。
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)结果:

发布于 2018-11-21 23:55:02
class from this answer that you can try for yourself
你的代码在正确的轨道上。有一堆可以清理的小东西(例如,您可以通过使用for... else构造检查您的循环是否中断)。您还需要__str__的适当实现。下面是完成所有这些工作的Capacity类的一个完整的工作实现:
import numpy as np
from PyQt5 import QtCore, QtGui, QtWidgets
class Capacity:
labels = (
('x', 'x value'),
('Nrd', 'Normal force'),
('Mrd', 'Moment capacity'),
('es', 'Bottom steel strain'),
('esc', 'Top steel strain'),
('sisc', 'Bottom steel stress'),
('sis', 'Top steel stress')
)
def __init__(self, *args, **kwargs):
# most recent values of interest
self.x = None
self.Nrd = None
self.Mrd = None
self.es = None
self.esc = None
self.sisc = None
self.sis = None
# if any args are passed to init, try to use them to run .check
if args or kwargs:
self.check(*args, **kwargs)
def check(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)
Nrd = None
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
# record values of interest for later printing
self.x = x
self.Nrd = Nrd
self.Mrd = Mrd
self.es = es
self.esc = esc
self.sisc = sisc
self.sis = sis
if 0 <= (float(Nrd) - Ned) <= 0.5:
# the return statement breaks the loop
return True
else:
# the else clause executes if the end of the for loop is reached without a break
if Nrd != Ned:
print('Errors','Tryk over hele tværsnit', sep=' ')
print(self)
app = QtWidgets.QApplication([])
error_dialog = QtWidgets.QErrorMessage()
error_dialog.showMessage('Increase size of column, compressed reinforced column!!')
app.exec_()
return False
def __str__(self):
strs = []
for attr,label in self.labels:
# loop through the labels and get the value of the corresponding attribute from self
val = getattr(self, attr)
strs.append('{}: {}'.format(label, val))
# join all the labeled attribute strings with newline characters and return the result
return '\n'.join(strs)然后,您可以像这样使用Capacity类:
capacity = Capacity(b=300, h=300, y=12, ecu=0.0035, cb=35, ct=35, fyd=435, fcd=20, Esd=2e5, Ned=1000)
print(capacity)将产生以下结果:
x value: 186.3985398539854
Normal force: 1000
Moment capacity: 130.8115324251227
Bottom steel strain: 0.0014758973472997895
Top steel strain: -0.0028428060107339903
Bottom steel stress: 435
Top steel stress: 295.1794694599579发布于 2018-11-21 23:39:01
您可能正在寻找类似于下面这样的内容,创建类attrs空,并调用一个类方法作为__init__的一部分填充它们,然后您可以使用__str__的重载来获得您想要的输出。F-字符串也可能更清晰。(我没有时间收集和测试您的代码,所以您可能需要做一些按摩)
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):
self.filename = b
self.x_value = None
self.nrm_frc = None
self.mom_cap = None
self.bsstress = None
self.tsstress = None
self.bsstrain = None
self.tsstrain = None
self.parse_file(b,h,y,ecu,cb,ct,fyd,fcd,Esd,Ned)
def parse_file(self,b,h,y,ecu,cb,ct,fyd,fcd,Esd,Ned):
#all the code for calculation where:
self.x_value = 'value'
self.nrm_frc = 'value'
self.mom_cap = 'value'
self.bsstress = 'value'
self.tsstress = 'value'
self.bsstrain = 'value'
self.tsstrain = 'value'
def __str__(self):
return ('\nx value: {0} \nNormalforce: {1} \nMoment capacity : {2} \nBottom steel strain : {3} '
'\nTop steel strain : {4} \nBottom steel stress :{5} \nTop steel stress : {6}'
.format(self.x_value, self.nrm_frc, self.mom_cap, self.bsstress, self.tsstress, self.bsstrain, self.tsstrain))
foo = Capacity(b= 300,h=250,y=12,ecu= 0.0035,cb=50,ct=50,fyd=435,fcd=20,Esd=2e5,Ned=800)
print foohttps://stackoverflow.com/questions/53346519
复制相似问题