Как перебрать 2-х шаговые переменные, чтобы найти все возможные их комбинации в модели? - PullRequest
0 голосов
/ 13 мая 2018

Я создаю модель, которая способна находить подходящие материалы на основе определенных значений, таких как объем, масса, деформация и т. Д. Поэтому мне нужно изменить значения E1 и E2 (свойства материала), а также соотношение / соотношение между E1 и E2, чтобы найти возможные подходящие материалы.

Однако я изо всех сил пытаюсь найти все возможные комбинации E1 и E2 в цикле.

Так что в настоящее время в моем коде я шаг E1 + = 200 и E2 + = 100. Но между ними не обязательно отношения 2: 1. Это может быть E1 + = 50 и E2 + = 350 и различные другие комбинации.

Общая цель - найти все комбинации E1 и E2, которые удовлетворяют критерию.

Я пытался упростить свой код, но вам не нужно проходить через все это. Я просто добавил его, чтобы вы могли запустить мой код и посмотреть вывод. Часть, с которой мне нужна помощь, прокомментирована:

    #________________PART OF CODING THAT NEEDS IMPROVEMENT!!!!________________

Вот моя модель:

#Libraries

import pandas as pd
import numpy as np
import scipy as sp
from math import pi
% matplotlib inline

#Functions:

def getVolume(d,l,w): 
    LengthLong = w - float(pi*d)/2     
    LengthShort = l - float(pi*d)/2
    AreaLong = d*LengthLong + float(pi*d**2)/4
    VolumeSphere = float(1/6)*(d**3)*(pi)
    return (AreaLong*LengthShort) + 4*VolumeSphere

def getStrain(sigma,t,E1,E2,N2):
    return (sigma*10**-6)*((1/E1)+((1/E2)*(1-np.exp(E2*t/N2))))

def getStress(d,P):
    return (d*P)/(2*thickness)

def getLength(l,Eta):
    return l +(l*Eta)

def RoundOFF(a):
    return float(format(a, '.5f'))

def Convert(b,num):
    return[ RoundOFF(x * num) for x in b]


#Stress-Strain Model Parameters:
E1 = 1000
E2 = 1000
N2 = -1

#Initial Values:

#Dimensions:
length = [1.2] #[m]
width = 0.9 #[m]
diameter = 0.3 #[m]
thickness = 0.042*10**-3 #Thickness of membrane [m]

#Assign initial values:
Pressure = 20000.00 #Pressure inside bag [Pa]
Volume = [0.2139149374734583] #Volume of bag based on data [m3]
Stress = [getStress(diameter,Pressure)]
Strain = [0.01962202859081995] #Strain of bag based on data
EE1 = [E1]
EE2 = [E2]

#Error Ranges
Strain_Min = (Strain[-1]*90/100) # Minimum Strain is 10% less than calculated bag
Strain_Max = (Strain[-1]*145/100) # Maximum Strain is 45% more than calculated bag
print(" Original strain =", Strain[-1],"\n","Minimum strain =",Strain_Min,"\n","Maximum strain =",Strain_Max,"\n")

Volume_Min = Volume[-1]*90/100 # Minimum Volume is 10% less than calculated bag
Volume_Max = Volume[-1]*110/100 # Maximum Volume is 10% more than calculated bag
print(" Original volume =", Volume[-1],"\n","Minimum volume=",Volume_Min,"\n","Maximum volume =",Volume_Max)

i=0
max_iter = 10
while i < max_iter and E1 < 200000 and E2 < 200000:


    #Stress.append(getStress(diameter,Pressure)) #get STRESS from BARLOWS FORMULA

    Strain.append(getStrain(Stress[0],277,E1,E2,N2)) #get STRAIN from HK MODEL

    length.append(getLength(length[0],Strain[i+1])) #get LENGTH from STRAIN FORMULA

    Volume.append(getVolume(diameter,length[i+1],width)) #get VOLUME of dunnage bag from GEOMETRY 

    #________________PART OF CODING THAT NEEDS IMPROVEMENT!!!!________________

    E1+=200
    EE1.append(E1)

    E2+=100
    EE2.append(E2)


 #_______________________________________________________________________

    i+=1


#Material pass/fail criteria:
for i in range(max_iter): 
    Volume[i]
    EE1[i]
    EE2[i]
    length[i]
    Strain[i]

#PASS Criteria
    if Volume[i]<Volume_Max and Volume[i]>Volume_Min and Strain[i]<Strain_Max and Strain[i]>Strain_Min :
        print("\n","PASS")
        print("Material parameters that pass criteria:")
        print("E1 [MPa] =", EE1[i])
        print("E2 [MPa] =", EE2[i],"\n")
        print("Resulting in output variables:")       
        print("Volume [m3] =", Volume[i])
        print("Length [m] =", length[i])
        print("Strain =", Strain[i])



    i+=1

df = pd.DataFrame({'Strain':Convert(Strain,1),'Length [m]':Convert(length,1),'E1 [MPa]':EE1,'E2 [MPa]':EE2,'Volume [m3]':Convert(Volume,1)})
df

Что дает этот вывод: Результаты

W.r.t улучшение модели Я думаю о чем-то вроде этого:

while i < max_iter and E1 < 200000:
    while E2 < 200000:

       Stress.append(getStress(diameter,Pressure)) #get STRESS from BARLOWS FORMULA

       Strain.append(getStrain(Stress[0],277,E1,E2,N2)) #get STRAIN from HK MODEL

       length.append(getLength(length[0],Strain[i+1])) #get LENGTH from STRAIN FORMULA

       Volume.append(getVolume(diameter,length[i+1],width)) #get VOLUME of dunnage bag from GEOMETRY 


       E2+=100

    E1+=100
    i+=1

Затем следует вывести все значения E2 для всех значений E1 в пределах диапазона шага. Будем весьма благодарны за любые указания в правильном направлении !!!

...