首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过类内的For循环进行行空间迭代

通过类内的For循环进行行空间迭代
EN

Stack Overflow用户
提问于 2018-11-16 23:04:32
回答 2查看 976关注 0票数 1

我创建了一个class capacity,它通过通过一个x迭代值x来进行一些计算。计算过程没有什么问题。我只需要打破或停止方程,当这个条件是匹配的。

代码语言:javascript
复制
self.Nrd= Ned

为了获得上述结果,我创建了以下条件,

代码语言:javascript
复制
e=float(Nrd)-Ned
if e>= 0 and e<=1:
    break

但这并不能产生一个好的和令人满意的结果,更好的说,没有真正的工作。

我希望你能帮助我,当Nrd = Ned条件达到时,停止方程。

第二个问题是,我并没有通过使用__str__方法得到任何信息。这些值是如何返回的?

守则:

代码语言:javascript
复制
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中实现它作为类。通过函数获取与显示相同的打印。

代码语言:javascript
复制
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)

结果:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-21 23:55:02

class from this answer that you can try for yourself

你的代码在正确的轨道上。有一堆可以清理的小东西(例如,您可以通过使用for... else构造检查您的循环是否中断)。您还需要__str__的适当实现。下面是完成所有这些工作的Capacity类的一个完整的工作实现:

代码语言:javascript
复制
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类:

代码语言:javascript
复制
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)

将产生以下结果:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2018-11-21 23:39:01

您可能正在寻找类似于下面这样的内容,创建类attrs空,并调用一个类方法作为__init__的一部分填充它们,然后您可以使用__str__的重载来获得您想要的输出。F-字符串也可能更清晰。(我没有时间收集和测试您的代码,所以您可能需要做一些按摩)

代码语言:javascript
复制
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 foo
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53346519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档