सोचा मैं हर संभावित समाधान है कि काम कर सकते हैं की एक अद्यतन देना चाहते हैं। जैसा कि पहले उल्लेख, डेटा अलग sinusoidal आवृत्तियों द्वारा जटिल है, इसलिए कुछ तरीकों इस वजह से काम न करें। नीचे सूचीबद्ध विधियां डेटा और आवृत्तियों को शामिल करने के आधार पर अच्छी हो सकती हैं।
सबसे पहले, मुझे लगता है डेटा रूप है कि:
y = average + b*e^-(c*x)
मेरे मामले में, औसत 290 है, इसलिए हमने:
y = 290 + b*e^-(c*x)
इसी के साथ
कहा जा रहा है, चलो में डुबकी चलो विभिन्न तरीकों कि मैंने कोशिश की:
findpeaks() विधि
इस विधि है कि सिकंदर Buse सुझाव दिया है।यह अधिकांश डेटा के लिए एक बहुत अच्छी विधि है, लेकिन मेरे डेटा के लिए, क्योंकि कई साइनसॉइडल फ्रीक्वेंसी हैं, इसलिए यह गलत चोटियों को प्राप्त करती है। लाल एक्स चोटी दिखाता है। यदि आप चोटियों पर अपने डेटा की अधिकांश
% Find Peaks Method
[max_num,max_ind] = findpeaks(y(ind));
plot(max_ind,max_num,'x','Color','r'); hold on;
x1 = max_ind;
y1 = log(max_num-290);
coeffs = polyfit(x1,y1,1)
b = exp(coeffs(2));
c = coeffs(1);
RANSAC
RANSAC अच्छा है। आप देखते हैं कि मेरे भीतर, कई आवृत्तियों की वजह से, शीर्ष के ऊपर अधिक चोटी मौजूद हैं। हालांकि, मेरे डेटा के साथ समस्या यह है कि सभी डेटा सेट इस तरह नहीं हैं। इसलिए, यह कभी-कभी काम करता था।
% RANSAC Method
ind = (y > avg);
x1 = x(ind);
y1 = log(y(ind) - avg);
iterNum = 300;
thDist = 0.5;
thInlrRatio = .1;
[t,r] = ransac([x1;y1'],iterNum,thDist,thInlrRatio);
k1 = -tan(t);
b1 = r/cos(t);
% plot(x1,k1*x1+b1,'r'); hold on;
b = exp(b1);
c = k1;
Lsqlin विधि
इस विधि का उपयोग किया here है। यह सिस्टम को बाधित करने के लिए Lsqlin का उपयोग करता है। हालांकि, यह मध्य में डेटा को अनदेखा करता है। आपके डेटा सेट के आधार पर, यह वास्तव में अच्छी तरह से काम कर सकता है क्योंकि यह मूल पोस्ट में व्यक्ति के लिए किया गया था।
% Lsqlin Method
avg = 290;
ind = (y > avg);
x1 = x(ind);
y1 = log(y(ind) - avg);
A = [ones(numel(x1),1),x1(:)]*1.00;
coeffs = lsqlin(A,y1(:),-A,-y1(:),[],[],[],[],[],optimset('algorithm','active-set','display','off'));
b = exp(coeffs(2));
c = coeffs(1);
अवधि
इस में Peaks का पता लगाएं, विधि मैं अपनी पोस्ट जहाँ मैं प्रत्येक क्षेत्र में शिखर पाने में उल्लेख किया है। यह विधि बहुत अच्छी तरह से काम करती है और इससे मुझे एहसास हुआ कि मेरे डेटा में वास्तव में एक संपूर्ण घातीय फिट नहीं हो सकता है। हम देखते हैं कि यह शुरुआत में बड़े चोटियों में फिट करने में असमर्थ है। मैं केवल पहले 150 डेटा बिंदुओं का उपयोग करके और स्थिर राज्य डेटा बिंदुओं को अनदेखा करके इसे थोड़ा बेहतर बनाने में सक्षम था। यहां मुझे हर 25 डेटा अंक चोटी मिली।
% Incremental Method 2 Unknowns
x1 = [];
y1 = [];
max_num=[];
max_ind=[];
incr = 25;
for i=1:floor(size(y,1)/incr)
[max_num(end+1),max_ind(end+1)] = max(y(1+incr*(i-1):incr*i));
max_ind(end) = max_ind(end) + incr*(i-1);
if max_num(end) > avg
x1(end+1) = max_ind(end);
y1(end+1) = log(max_num(end)-290);
end
end
plot(max_ind,max_num,'x','Color','r'); hold on;
coeffs = polyfit(x1,y1,1)
b = exp(coeffs(2));
c = coeffs(1);
का उपयोग करते हुए सभी 500 डेटा बिंदुओं:
पहले 150 डेटा बिंदुओं का उपयोग करना:
के साथ काल में Peaks खोजें ख विवश
जब से मैं यह करना चाहते हैं पहली चोटी पर शुरू करें, मैंने बी मान को बाधित किया। मुझे पता है कि सिस्टम y=290+b*e^-c*x
है और मैं इसे b=y(1)-290
पर रोकता हूं। ऐसा करके, मुझे बस सी के लिए हल करने की आवश्यकता है जहां c=(log(y-290)-logb)/x
। मैं फिर औसत का औसत या औसत ले सकता हूं। यह विधि भी काफी अच्छी है, यह अंत के साथ मूल्य के अनुरूप भी फिट नहीं है लेकिन यह एक सौदा जितना बड़ा नहीं है क्योंकि परिवर्तन कम है।
% Incremental Method 1 Unknown (b is constrained y(1)-290 = b)
b = y(1) - 290;
c = [];
max_num=[];
max_ind=[];
incr = 25;
for i=1:floor(size(y,1)/incr)
[max_num(end+1),max_ind(end+1)] = max(y(1+incr*(i-1):incr*i));
max_ind(end) = max_ind(end) + incr*(i-1);
if max_num(end) > avg
c(end+1) = (log(max_num(end)-290)-log(b))/max_ind(end);
end
end
c = mean(c); % Or median(c) works just as good
यहाँ मैं हर 25 डेटा बिंदुओं के लिए शिखर ले और फिर ग का मतलब ले
यहाँ मैं हर 25 डेटा बिंदुओं के लिए शिखर ले और फिर ग की औसत ले
यहाँ मैं हर 10 डेटा बिंदुओं के लिए शिखर ले और फिर ग
धन्यवाद सिकंदर की संकरी ले। तो इस डेटा के साथ मुश्किल चीज यह है कि यह केवल एक साइनसॉइडल आवृत्ति नहीं है, इसलिए खोजेक्स का उपयोग करके लहर की चोटियों को समाप्त करना समाप्त होता है जो वास्तव में क्षेत्र में अधिकतम नहीं होते हैं। मैंने अपनी मूल पोस्ट को वास्तविक सिग्नल के साथ जुड़े अंकों के साथ अपडेट किया। मैंने अभी तक वक्र फिटिंग टूलबॉक्स के साथ इसे फ़िट करने का प्रयास नहीं किया है (यह मेरे कंप्यूटर पर नहीं है) लेकिन जब मैं स्कूल में हूं तो मैं इसे आज़मा दूंगा। –