【问题标题】:How to use while loop to check difference between calculation output , convergence calculation如何使用while循环检查计算输出、收敛计算之间的差异
【发布时间】:2021-08-03 16:46:01
【问题描述】:

我正在编写执行计算的代码:

def elastic_buckling_pressure(corroded_wall_thickness,
                              external_radius_mm,
                              lambda_value,
                              n_value,
                              youngs_modulus_mpa,
                              poissons_ratio):
    """
    """
    section_1 = (1 / ((n_value ** 2 + 0.5 * (lambda_value ** 2)) - 1)
                 ) * ((youngs_modulus_mpa * corroded_wall_thickness) / external_radius_mm)
    section_2_part_1 = ((n_value**2 + lambda_value**2 - 1)**2 / (12 *(1 - poissons_ratio**2))) * (
            corroded_wall_thickness / external_radius_mm)
    section_2_part_2 = lambda_value**4 / (n_value**2 + lambda_value**2)**2
    section_2 = section_2_part_1 + section_2_part_2
    calculated_pel_value = section_1 * section_2
    return calculated_pel_value

我想在每次迭代时传递从 2 开始的增量 n_value 值然后 +0.10。

但是,对于我正在编写的 while 循环计数器的迭代,代码不起作用。

def iteration_calculation(corroded_wall_thickness,
                          external_radius_mm,
                          lambda_value,
                          n_value,
                          youngs_modulus_mpa,
                          poissons_ratio):
    epsilon = 0.00001
    count = 0
    max_iteration = 1000
    beta = 0.001
    while count < max_iteration:
        calculated_pel = elastic_buckling_pressure(corroded_wall_thickness=corroded_wall_thickness,
                                                   external_radius_mm=external_radius_mm,
                                                   lambda_value=lambda_value,
                                                   n_value=n_value,
                                                   youngs_modulus_mpa=youngs_modulus_mpa,
                                                   poissons_ratio=poissons_ratio)
        changed_n_value = n_value + 0.10
        changed_calculated_pel = elastic_buckling_pressure(corroded_wall_thickness=corroded_wall_thickness,
                                                           external_radius_mm=external_radius_mm,
                                                           lambda_value=lambda_value,
                                                           n_value=changed_n_value,
                                                           youngs_modulus_mpa=youngs_modulus_mpa,
                                                           poissons_ratio=poissons_ratio)
        change_value = changed_calculated_pel - calculated_pel
        if abs(change_value) < epsilon:
            beta = calculated_pel
            break
        else:
            beta = changed_calculated_pel
        count += 1
    value_calculated = beta * 1
    return value_calculated
training dataset
'corroded_wall_thickness': np.array([10]),
'external_radius_mm': np.array([250]),
'lambda_value': np.array([0.5]),
'n_value': np.array([2]),
'youngs_modulus_mpa': np.array([350000]),
'poissons_ratio': np.array([0.33])

但是代码不会迭代,我有点挣扎如何创建迭代循环。 我想在 epsilon 值 0.00001 中至少实现计算的_pel 和 changed_calculated_pel 之间的差异。一旦实现,代码应该中断并给出收敛值。但是,我缺乏编码能力已经产生了更多的问题。所以,今天我来找你帮忙。任何建议将不胜感激。

谢谢!

【问题讨论】:

    标签: python loops for-loop while-loop iteration


    【解决方案1】:

    对于任何可能遇到类似情况的人: 我已经设法解决了这个问题。

                                                                                                                             
    def iteration_calculation(corroded_wall_thickness,                                                                        
                              external_radius_mm,                                                                             
                              lambda_value,                                                                                   
                              youngs_modulus_mpa,                                                                             
                              poissons_ratio):                                                                                
        list_value = {}                                                                                                       
        epsilon = 25                                                                                                          
        count = 0                                                                                                             
        max_iteration = 100000                                                                                                                                                                                                          
        min_value = float("inf")                                                                                              
        last_value = float("inf")                                                                                             
        changed_n_value = 2                                                                                                   
        while count < max_iteration:                                                                                         
                                                                                                                             
            new_value = elastic_buckling_pressure(corroded_wall_thickness=corroded_wall_thickness,                            
                                                   external_radius_mm=external_radius_mm,                                    
                                                   lambda_value=lambda_value,                                                
                                                   n_value=changed_n_value,                                                  
                                                   youngs_modulus_mpa=youngs_modulus_mpa,                                    
                                                  poissons_ratio=poissons_ratio)                                             
            list_value[changed_n_value] = new_value                                                                          
            if abs(last_value - new_value) < epsilon:                                                                        
                break                                                                                                        
            last_value = new_value                                                                                           
                                                                                                                             
                                                                                                                             
            changed_n_value +=0.10                                                                                           
                                                                                                                             
            if new_value < min_value:                                                                                        
                min_value = new_value                                                                                        
            count+=1                                                                                                         
        return min_value, list_value                                                                                         
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      相关资源
      最近更新 更多