2013-05-27 12 views
7

मेरे पास डेटा की एक सरणी है, जब प्लॉट किया गया है, ऐसा लगता है।MATLAB वक्र-फिटिंग, घातीय बनाम रैखिक

http://s12.postimg.org/7ja47a6b1/temp.jpg

मैं polyfit आदेश का उपयोग करने के लिए मोटे तौर पर 1.7 और 2.3 के बीच समय के लिए सबसे अच्छा फिटिंग घातीय निर्धारित करने के लिए की जरूरत है। मुझे इस घातीय की तुलना एक साधारण रैखिक फिट से भी तुलना करनी चाहिए।

मैं समीकरण Temp(t) = Temp0 * exp(-(t-t0)/tau), जहां t0 समय तापमान Temp0 करने के लिए इसी है दी कर रहा हूँ (मैं जहाँ मेरे वक्र फिटिंग शुरू करने के लिए चुन सकते हैं, लेकिन यह मोटे तौर पर 1.7 और 2.3 के बीच के क्षेत्र तक ही सीमित होना चाहिए)। मेरा प्रयास यहाँ है।

% Arbitrarily defined starting point 
t0 = 1.71; 

%Exponential fit 
p = polyfit(time, log(Temp), 1) 
tau = -1./p(1) 
Temp0 = exp(p(2)) 

tm = 1.8:0.01:2.3; 
Temp_t = Temp0*exp(-(tm)/tau); 
plot(time, Temp, tm, Temp_t) 

figure(2) 

%Linear fit 
p2 = polyfit(time, Temp, 1); 
Temp_p = p2(1)*tm + p2(2); 
plot(time, Temp, tm, Temp_p) 

मेरा घातीय फिट exponential fit जैसा दिखता है। मेरा रैखिक फिट linear fit जैसा दिखता है। (आभासी समरूप)। मैं गलत तरीके से क्या कर रहा हूँ? क्या दो फिट इतने समान हो सकते हैं? मुझे बताया गया है कि circshift मदद कर सकता है, लेकिन सहायता फ़ाइल पढ़ने के बाद मैं आदेश की प्रयोज्यता को समझ नहीं पाया।

+0

@ एमोरो से लिंक द मैथवर्क्स द्वारा तोड़ दिया गया प्रतीत होता है। अद्यतन संस्करण [यहां] है (http://www.mathworks.com/help/stats/examples/curve-fitting-and-distribution-fitting.html)। – horchler

+1

धन्यवाद @horchler, उदाहरण के लिए मैंने अपडेट किया गया उदाहरण अपडेट किया गया है: [लाइनरिटी में परिवर्तन करके फिटिंग नॉनलाइनर मॉडल में समस्याएं] (http://www.mathworks.com/help/stats/examples/pitfalls-in- फिटिंग-नॉनलाइनर-मॉडल-बाय-ट्रांसफॉर्मिंग-टू-लाइनरिटी.html) – Amro

उत्तर

4

हालात से व्यवहार कर रहे हैं बस के रूप में आप उम्मीद कर रहे हैं। समस्या यह है कि जिस फ़ंक्शन को आप फिट करने का प्रयास कर रहे हैं वह डेटा का बहुत अच्छा अनुमान नहीं है। वक्र को नजरअंदाज करते हुए, ऐसा लगता है कि वक्र का घातीय भाग 16 के आसपास के मूल्य के रूप में asymptotically होता है; लेकिन आप जिस फ़ंक्शन का उपयोग कर रहे हैं वह अंततः 0 का तापमान होगा। इस प्रकार, 22 से 16 तक जा रहे हिस्से में फ़िट होने से आपको लगभग रैखिक संबंध मिल जाएगा। इसे स्पष्ट करने के लिए मैंने कोड की कुछ पंक्तियां लिखीं जो आपके पास मौजूद डेटा बिंदुओं से मेल खाते हैं - और यह दिखाता है कि अलग-अलग फ़ंक्शंस (जो 0 तक जाता है, और दूसरा जो 16 तक जाता है) आपको वक्र का एक बहुत अलग आकार देगा। पहला (आपका मूल कार्य) 22 और 16 के टी मानों के बीच लगभग रैखिक है - इसलिए यह रैखिक फिट की तरह दिखेगा।

मेरा सुझाव है कि आप फिट करने के लिए "सही" आकार के बारे में सोचें - अंतर्निहित भौतिकी क्या है जो आपको एक विशेष रूप चुनती है? यह अधिकार प्राप्त करना आवश्यक है ...

time = linspace(1.5, 2.5, 200); 
t0 = 1.7; 
t1 = 2.3; 
tau = 2.0; 

% define three sections of the function: 
s1 = find(time < t0); 
s2 = find(time >= t0 & time < t1); 
s3 = find(time > 2.3); 

% compute a shape for the function in each section: 
tData(s1) = 28 - 50*(time(s1)-1.5).^2; 
tData(s2) = 22*exp(-(time(s2)-t0)/tau); 
tData(s3) = tData(s2(end)) + (s3 - s3(1))*12/numel(s3); 

figure 
plot(time, tData) 

% modify the equation slightly: assume equilibrium temperature is 16 
% with a bit of effort one could fit for this as a second parameter 
Teq = 16; 
tData2 = tData; 
tau2 = tau/8; % decay more strongly to get down to approx the same value by t1 
tData2(s2) = (22 - Teq) * exp(- (time(s2) - t0)/tau2) + Teq; 
tData2(s3) = tData2(s2(end)) + (s3 - s3(1))*12/numel(s3); 

hold on; 
plot(time, tData2, 'r') 

यह निम्न साजिश में परिणाम:

यहाँ कोड है कि मुख्य कारण अपने भूखंडों तो समान दिखाई है

enter image description here

मैं इस से निष्कर्ष है कि समारोह आप फिट करने का प्रयास कर रहे डोमेन पर लगभग रैखिक है - फ़ंक्शन की एक अलग पसंद बेहतर मिलान होगी। मैटलैब वक्र ढाले पिटारे में

+1

बहुत धन्यवाद, फ्लोरिस। मैं आपकी प्रतिक्रिया की सराहना करता हूं। मुझे वक्र-फिट के दो रूपों की तुलना करने और डेटा को बेहतर बनाने वाले व्यक्ति की पहचान करने के लिए कहा गया था। मैंने माना था कि फॉर्म अधिक विशिष्ट होंगे और, जब वे नहीं थे, तो मैंने अपना कोड संदेह करना शुरू कर दिया। आपका उत्तर बहुत स्पष्ट और जानकारीपूर्ण है, और मैं आपको धन्यवाद देता हूं। – scimaks

2

यदि मैं सही ढंग से समझता हूं, तो पॉलीफिट में उपयोग किए जाने वाले वेरिएबल समय और टेम्पल में सभी मान होते हैं (1.5 से 2.5 तक)। तो आप पॉलीफिट की गणना करने से पहले समय और तापमान को 1.71 से 2.3 तक सीमित करना चाहते हैं (अभी यह पॉलीफिट की गणना 1.5 से 2.5 तक है, इसलिए लाइन डेटा बिंदुओं के साथ गठबंधन क्यों नहीं है)।

p = polyfit(time, log(Temp), 1) 
+0

आप सही m_power हैं! धन्यवाद। मैंने नए फिट अपलोड किए हैं। क्या घातीय और रैखिक फिट इतना समान दिखना चाहिए? फिर से धन्यवाद! – scimaks

4

मैं टिप्पणी में उल्लेख किया है, वहाँ बनाम एक गैर रेखीय मॉडल फिटिंग (दोनों कम से कम वर्गों अर्थ में) लॉग-अंतरिक्ष में एक रेखीय मॉडल फिटिंग के बीच एक अंतर है।

स्थिति टूलबॉक्स में एक अच्छा demo स्थिति बताता है। मैं नीचे दिए गए कोड को अपनाने कर रहा हूँ:

%# sample data 
x = [5.72 4.22 5.72 3.59 5.04 2.66 5.02 3.11 0.13 2.26 ... 
    5.39 2.57 1.20 1.82 3.23 5.46 3.15 1.84 0.21 4.29 ... 
    4.61 0.36 3.76 1.59 1.87 3.14 2.45 5.36 3.44 3.41]'; 
y = [2.66 2.91 0.94 4.28 1.76 4.08 1.11 4.33 8.94 5.25 ... 
    0.02 3.88 6.43 4.08 4.90 1.33 3.63 5.49 7.23 0.88 ... 
    3.08 8.12 1.22 4.24 6.21 5.48 4.89 2.30 4.13 2.17]'; 

xx = linspace(min(x), max(x), 100); 

%# linear regression in log-space 
%#   y = p2 * exp(p1*x) 
%# => log(y) = log(p2) + p1*x 
p_exp = polyfit(x, log(y), 1); 
yy1 = exp(p_exp(2)) .* exp(xx .* p_exp(1)); 

%# linear regression 
p_lin = polyfit(x, y, 1); 
yy2 = polyval(p_lin, xx); 

%# non-linear regression (using previous result as initial coeff) 
f = @(p,x) p(2)*exp(p(1)*x); 
p_nonlin = nlinfit(x, y, f, [p_exp(1) exp(p_exp(2))]); 
yy3 = f(p_nonlin, xx); 

plot(x,y,'o', xx,yy1,'-', xx,yy2,'-', xx,yy3,'-') 
legend({'data points','linear in log-space','linear','non-linear'}) 

regression

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