2013-02-03 15 views
6

मैं एक मॉडल बनाने की कोशिश कर रहा हूं जिसमें कुछ घटक मौजूद हों या नहीं (मेरे मामले में, तरल बंदरगाहों) के आधार पर थोड़ा अलग समीकरण होंगे।सशर्त घटक घोषणा और समीकरण

निम्नलिखित की तरह एक कोड काम नहीं करेगा:

parameter Boolean use_component=false; 
Component component if use_component; 
equation 
if use_component then 
    component.x = 0; 
end if; 

मैं इस के आसपास कैसे काम कर सकते हैं?

उत्तर

8

आप हालत घटकों का उपयोग करना चाहते हैं, वहाँ कुछ प्रतिबंध आप के बारे में पता करने की आवश्यकता है है। मॉडलिका 3.3 विनिर्देश की धारा 4.4.5 इसे अच्छी तरह से बताती है। यह कहता है "यदि स्थिति गलत है, तो घटक, इसके संशोधक, और किसी भी कनेक्ट समीकरण घटक को शामिल करते हैं, हटा दिए जाते हैं"। मैं आपको दिखाऊंगा कि आपकी समस्या को हल करने के लिए इसका उपयोग कैसे करें, लेकिन पहले मैं यह बताना चाहता हूं कि आपका समाधान क्यों काम नहीं करता है।

समस्या को मॉडल की जांच के साथ करना है। आपके मामले में, यह स्पष्ट है कि समीकरण component.x और घटक component दोनों मौजूद हैं या न ही मौजूद हैं। ऐसा इसलिए है क्योंकि आपने उन्हें एक ही बूलियन चर से बांध दिया है। लेकिन क्या होगा यदि आपने यह नहीं किया:

parameter Real some_number; 
Component component if some_number*some_number>4.0; 
equation 
if some_number>=-2 and some_number<=2 then 
    component.x = 0; 
end if; 

हम देख सकते हैं कि यह आपके तर्क के समान है। के लिए component अनुपस्थित होने पर मौजूद होने का कोई मौका नहीं है। लेकिन क्या हम सामान्य में ऐसी चीजें साबित कर सकते हैं? सं।

इसलिए, जब सशर्त घटकों को पेश किया गया था, रूढ़िवादी अर्थशास्त्र लागू किए गए थे जो हमेशा छोटे से सुनिश्चित कर सकते हैं कि चर और समीकरणों के सेट कभी भी "सिंक से बाहर नहीं" प्राप्त होते हैं।

हमें क्या विनिर्देश कहते हैं पर लौटने के लिए करते हैं: "अगर हालत झूठी है, घटक, अपने संशोधक, और किसी भी कनेक्ट समीकरणों घटक को शामिल, निकाल दिए जाते हैं"

अपने मामले के लिए, समाधान कर सकता है संभावित रूप से काफी सरल हो। "X" घोषित करने के आधार पर, आप केवल component में संशोधन जोड़ सकते हैं, यानी।

parameter Boolean use_component=false; 
Component component(x=0) if use_component; 

इस की शान है कि संशोधन केवल component पर लागू होता है है और अगर component मौजूद नहीं है, न तो संशोधन (समीकरण) है। तो परिवर्तनीय x और इसके संबंधित समीकरण "सिंक में" हैं। लेकिन यह सभी मामलों के लिए काम नहीं करता है (आईआईआरसी, x के पास काम करने के लिए input क्वालीफायर होना चाहिए ... शायद आपके मामले में यह संभव है?)।

दो शेष विकल्प हैं। सबसे पहले, समीकरण component.xcomponent के अंदर रखें। दूसरा, component पर एक कनेक्टर पेश करना है, यदि कनेक्ट किया गया है, तो वह समीकरण उत्पन्न करेगा जो आप चाहते हैं। संशोधन के मामले के साथ होता है (यह एक संयोग नहीं है), तो आपको किसी तरह के एक इनपुट कनेक्टर के साथ x से संबद्ध कर सकते हैं और फिर इस कार्य करें:

parameter Boolean use_component; 
Component component if use_component; 
Constant zero(k=0); 
equation 
connect(k.y, component.x); 

अब, मैं कल्पना कर सकता है कि तीनों मामलों पर विचार के बाद (संशोधन, समीकरण को आंतरिक करें और connect का उपयोग करें), आप इस निष्कर्ष पर आते हैं कि उनमें से कोई भी काम नहीं करेगा। यदि यह मामला है, तो मैं नम्रता से सुझाव दूंगा कि आपको इस बात का कोई मुद्दा है कि आपने घटक को कैसे डिजाइन किया है। इन प्रतिबंधों का कारण बनने का कारण स्वयं को द्वारा शुद्धता के लिए घटकों की जांच करने की आवश्यकता से संबंधित है। यह आवश्यक है कि घटक पूर्ण हो (विनिर्देश की शब्दावली में "संतुलित")।

यदि आप ऊपर वर्णित दृष्टिकोणों के साथ समस्या का समाधान नहीं कर सकते हैं, तो मुझे संदेह है कि आपको वास्तव में संतुलित संतुलन है और आपको शायद किसी भी तरह से अपने घटक की सीमाओं को फिर से परिभाषित करने की आवश्यकता है। यदि ऐसा है, तो मैं सुझाव दूंगा कि आप जो कुछ करने का प्रयास कर रहे हैं उसके ब्योरे के साथ यहां एक और प्रश्न खोलें।

1

मुझे लगता है कि यह क्यों काम नहीं करेगा कारण यह है कि पार्सर चर "घटक.एक्स" की घोषणा की तलाश करेगा, यदि घटक सक्रिय नहीं है, तो मौजूद नहीं है। यह एनोटेशन में "मूल्यांकन = सत्य" डालने पर भी काम नहीं करता है। मेरी राय में सबसे साफ समाधान समीकरण स्तर पर काम करना और उसी ब्लॉक में समीकरणों के विभिन्न सेट सक्षम करना है। आप सही कनेक्टर और पैरामीटर के साथ एक रैपर मॉडल बना सकते हैं, और फिर यदि यह एक कारण मॉडल है उदाहरण के लिए आप मॉडलों को पैरामीटर के रूप में पैरामीटर करने के लिए प्रतिस्थापन योग्य वर्गों का उपयोग कर सकते हैं, या अन्यथा, अजीब मॉडल के मामले में, समीकरणों को अंदर रखें अगर बयान। एक और संभावित कामकाज एक ब्लॉक के अंदर दो अलग-अलग मॉडल रखना है, ताकि आप समीकरण अनुभाग में अपने चर का उपयोग कर सकें और फिर सशर्त कनेक्शन तैयार कर सकें जो चुनिंदा व्यवहार के साथ ब्लॉक के उपयोग को सक्षम कर सके। दूसरे शब्दों में आप अंदर दो ब्लॉक के साथ "रैप मॉडल" बना सकते हैं, और उसके बाद कथन के अंदर रैप मॉडल के कनेक्टर को कनेक्शन समीकरण रख सकते हैं। मॉडल का निर्माण करना याद रखें ताकि उपयोग किए जाने वाले ब्लॉक के लिए भी कोटेशन की एक सतत प्रणाली होगी। लेकिन यह सबसे अच्छा समाधान नहीं है, क्योंकि यदि ब्लॉक बड़े हैं तो आपको संकलन के लिए लंबा समय इंतजार करना होगा क्योंकि सब कुछ संकलित किया जाएगा।

मुझे आशा है कि यह मदद मिलेगी,

मार्को

0

तुम भी एक डमी घटक है कि ग्राफिकल परत में दिखाई नहीं देता है बना सकते हैं:

connector DummyHeatPort 
    "Dummy heatport to facilitate optional heatport. Use this with a conditional heatport by connecting it to the heatport. Then use the -DummyHeatPort.Q_flow in the thermal energy balance." 
    Modelica.SIunits.Temperature T "Port temperature"; 
    flow Modelica.SIunits.HeatFlowRate Q_flow 
    "Heat flow rate (positive if flowing from outside into the component)"; 
end DummyHeatPort; 

फिर जब यह एक दो बंदरगाह मॉडल

Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a heatport if use_heat_port; 
DummyHeatPort dummy_heatport; 

में इस्तेमाल किया जाता है ...

equation 
flowport_a.H_flow + flowport_b.H_flow - dummy_heatport.Q_flow = storage 
    "thermal energy balance"; 
    connect(dummy_heatport, heatport); 

इस प्रकार हीटपोर्ट का उपयोग तब किया जाता है जब अन्यथा कोई त्रुटि नहीं होती है।

संबंधित मुद्दे