Matlab

2013-02-19 14 views
5

में ओडीई को हल करते समय किसी अज्ञात फ़ंक्शन को ईवेंट-फ़ंक्शन के रूप में उपयोग करना संभव है क्या मैटलैब में किसी ईवेंट फ़ंक्शन के रूप में अज्ञात फ़ंक्शन का उपयोग करना संभव है। मुझे क्या करना चाहते हैं मूल रूप सेMatlab

opt = odeset('Events', @(t,y) (deal(y(end)-t^2,1,0))); 
[T,Y] = ode45(@odefun,[tstart tend],y0,opt); 

बहरहाल, यह शिकायत है कि आउटपुट की संख्या निपटने के लिए बिल्कुल मेल खाना आवश्यक एक त्रुटि देता है। अज्ञात फ़ंक्शन को कई तर्क वापस करने का कोई अन्य तरीका है?

उत्तर

0

इसके अलावा (इसमें इस खेल को जोड़ने में बहुत देर हो चुकी है, लेकिन यह मुझे निराश करती है)। (आप अलग अलग घटना कार्यों के बहुत सारे उपयोग करने के लिए है, तो काम)

function [ dealfunchandle ] = dealwithit(arrayfunc) 
% Takes as input an event function of (t,z) that returns a 3 array (in same order as event syntax). 

    function [a, b, c] = dealfunc(t,z) 
     output = arrayfunc(t,z); 
     a = output(:,1); 
     b = output(:,2); 
     c = output(:,3); 
    end 

dealfunchandle = @dealfunc; 
end 

यह फ़ंक्शन केवल एक बार लिखा जाना है: यहाँ नेस्टेड कार्यों के साथ एक समाधान है। इसका उपयोग कोड के भीतर एक अनाम घटना फ़ंक्शन उत्पन्न करने के लिए किया जा सकता है:

arrayfunc = @(t,y) [y(1), 0, 1]; 
events = dealwithit(arrayfunc); 

opts = odeset('Events', events); 

और फिर सामान्य के अनुसार ode45।

1

नहीं, आप इसे नहीं कर सकते हैं। Matlab में बेनामी फ़ंक्शन केवल एक मान लौटाते हैं।

इसके बजाय, आप deal चारों ओर एक पतली आवरण को परिभाषित करने और एक संभाल के रूप में अपने आवरण गुजारें सकता:

function [a b c] = wrapper(t,y) 
    [a b c] = deal('some stop condition', 1, 0); 
end 

opt = odeset('Events', @wrapper); 

[T, Y] = ode45(@odefun, [tstart tend], y0, opt); 
+1

बिंदु यह है कि मैं एक रैपर समारोह से बचना चाहता हूं। सौदा का उपयोग करके, आप वास्तव में अज्ञात फ़ंक्शन को तीन मान वापस करने के लिए प्राप्त कर सकते हैं (क्योंकि सौदा केवल इसके तर्क लौटाता है)। हालांकि, ओडीई-सॉल्वर वापसी मूल्यों की एक अलग संख्या की उम्मीद कर रहा है, जबकि सौदा बिल्कुल मेल खाना चाहिए। –

+0

आप बिल्कुल सही हैं। जब मैं बदलाव करता हूं तो मुझे इस पर एक और नजर आएगी। मुझे संदेह है कि यह इस तथ्य से संबंधित हो सकता है कि 'ode45' ईवेंट हैंडलर को तर्कों की एक चर संख्या को पास करता है। –

+0

मुझे संदेह है कि यह 'odeevents' में एक आउटपुट के साथ और' odezero' में आउटपुट ट्रिपलेट के साथ मूल्यांकन किए जाने वाले फ़ंक्शन के कारण है। हालांकि, किसी अज्ञात फ़ंक्शन के आउटपुट तर्क की संख्या या तो एक * या * तीन है, लेकिन यह दोनों को संभाल नहीं सकती है। – embert

2

मैं इस पोस्ट में एक ही सवाल का जवाब की तलाश में देखा। इसका मतलब है कि कुछ लोगों के लिए सवाल अभी भी वैध हो सकता है। आखिरकार मुझे अपने आप से समाधान मिला, मैं थोड़ा सा "पुराना" जवाब देना चाहता हूं।

असल में, हाँ - यह संभव है लेकिन सीधा नहीं है। इसे आज़माएं:

evnt_fun = @ (टी, एफ) subsref ({'कुछ स्टॉप हालत', 1, 0}, स्ट्रक्चर ('टाइप', '{}', 'subs', {{':'} }));

मैं कोड की पिछड़े-संगतता को पूरी तरह से जांचने में सक्षम नहीं हूं। हालांकि, यह R2011 और बाद में MATLAB संस्करणों के साथ काम करता है।