मेरे पास निम्न (300-1000K) और उच्च (1000-3000K) तापमान के लिए दो थर्मोडायनामिक संबंध हैं। यदि मैं इन दोनों को Gekko में उपयोग करना चाहता हूं, तो मैं उन्हें एक एकल सहसंबंध में कैसे जोड़ सकता हूं जिसका उपयोग मैं अनुकूलन समस्या में कर सकता हूं?

यहां पायथन कोड का एक खंड है जो 300K से 3000K तक कम या उच्च तापमान संबंध की गणना करता है।

Heat capacity for Methane

import numpy as np
import matplotlib.pyplot as plt

T = np.linspace(300.0,3000.0,50)

a_lo = np.array([ 5.15,-1.37E-02,4.92E-05,-4.85E-08,1.67E-11])
a_hi = np.array([7.49E-02,1.34E-02,-5.73E-06,1.22E-09,-1.02E-13])
i_lo = np.where(np.logical_and(T>=300.0, T<1000.0))
i_hi = np.where(np.logical_and(T>=1000.0, T<=3000.0))
cp = np.zeros(50)
Rg = 8.314 # J/mol-K
cp[i_lo] = a_lo[0] + a_lo[1]*T[i_lo] + a_lo[2]*T[i_lo]**2.0 + \
             a_lo[3]*T[i_lo]**3.0 + a_lo[4]*T[i_lo]**4.0
cp[i_hi] = a_hi[0] + a_hi[1]*T[i_hi] + a_hi[2]*T[i_hi]**2.0 + \
             a_hi[3]*T[i_hi]**3.0 + a_hi[4]*T[i_hi]**4.0
cp *= Rg

plt.plot(T,cp,'k-',lw=5)
plt.plot(T[i_lo],cp[i_lo],'.',color='orange')
plt.plot(T[i_hi],cp[i_hi],'.',color='red')
plt.xlabel('Temperature (K)'); plt.grid()
plt.ylabel(r'$CH_4$ Heat Capacity $\left(\frac{J}{mol-K}\right)$')
plt.show()

मैंने अपने मॉडल के निर्माण में एक सशर्त (यदि) कथन का उपयोग करने की कोशिश की लेकिन यह केवल प्रारंभिक मूल्यों से चुने गए सहसंबंध का उपयोग करता है। यदि तापमान T मेरे मॉडल में एक चर है, तो मैं इसे तापमान चर के आधार पर एक या दूसरे पर स्विच करना चाहता हूं।

1
TexasEngineer 23 सितंबर 2020, 17:58

1 उत्तर

आपके अनुकूलन या सिमुलेशन समस्या में सशर्त फ़ंक्शन का उपयोग करने के लिए कुछ दृष्टिकोण हैं। पहला दृष्टिकोण सटीक नहीं है, लेकिन एक घन तख़्ता का उपयोग करके एक उपयुक्त सन्निकटन हो सकता है जो नमूना बिंदुओं के बीच एक प्रक्षेप बनाता है (देखें दृष्टिकोण #1)। दूसरा दृष्टिकोण सटीक है लेकिन इसके लिए या तो if2() के साथ पूरक बाधाओं (एमपीसीसी) के साथ एक गणितीय कार्यक्रम या if3() के साथ एक पूर्णांक स्विच चर की आवश्यकता होती है (देखें दृष्टिकोण #2)। इन दो दृष्टिकोणों पर अनुकूलन में तार्किक स्थिति पर डिज़ाइन ऑप्टिमाइज़ेशन कोर्स पेज में चर्चा की गई है .

import numpy as np
import matplotlib.pyplot as plt
from gekko import GEKKO

# CH4 Heat capacity parameters (LO: 300-1000K, HI: 1000K-3000K)
a_lo = np.array([ 5.15,-1.37E-02,4.92E-05,-4.85E-08,1.67E-11])
a_hi = np.array([7.49E-02,1.34E-02,-5.73E-06,1.22E-09,-1.02E-13])
Rg = 8.314 # J/mol-K
m  = GEKKO()

# Approach #1: Cubic Spline
def cp1(T):
    if T>=300 and T<=1000:
        a = a_lo
    elif T>1000 and T<=3000:
        a = a_hi
    else:
        raise Exception('Temperature ' + str(T) + ' out of range')
    cp = (a[0]+a[1]*T+a[2]*T**2.0+a[3]*T**3.0+a[4]*T**4.0)*Rg
    return cp
# Calculate cp at 50 pts
T = np.linspace(300.0,3000.0,50)
cp = [cp1(Ti) for Ti in T]
x1 = m.Var(lb=300,ub=3000); y1 = m.Var()
m.cspline(x1,y1,T,cp)

# Approach #2: Gekko conditional statements
def cp2(a,T):
    return (a[0]+a[1]*T+a[2]*T**2.0+a[3]*T**3.0+a[4]*T**4.0)*Rg
x2  = m.Var(lb=300,ub=3000)
y2a = m.Intermediate(cp2(a_lo,x2)); 
y2b = m.Intermediate(cp2(a_hi,x2)); 
y2  = m.if3(x2-1000,y2a,y2b)

m.Equation(y1==80)
m.Equation(y2==80)

m.solve()

print('Find Temperature where cp=80 J/mol-K')
print(x1.value[0],x2.value[0])
0
John Hedengren 24 सितंबर 2020, 03:07