5

मैं damped हार्मोनिक दोलन युक्त डेटा सेट करने के लिए एक घातीय वक्र फिट करने के लिए कोशिश कर रहा हूँ।कैसे MATLAB में हार्मोनिक दोलन डेटा damped के लिए एक घातीय वक्र फिट करने के लिए?

enter image description here

मैं डेटा में क्षय की दर को खोजने की जरूरत: डेटा एक सा अर्थ है कि sinusoidal दोलन कई आवृत्तियों शामिल में जटिल रूप में नीचे देखा जाता है। जिस विधि का मैं उपयोग कर रहा हूं वह here पाया जा सकता है।

lsqlin(A,y1(:),-A,-y1(:),[],[],[],[],[],optimset('algorithm','active-set','display','off')) 

फिट करने के लिए: यह कैसे काम करता है, यह स्थिर राज्य मूल्य से ऊपर y मूल्यों का लॉग लेता है और उसके बाद का उपयोग करता है।

हालांकि, इस परिणाम में निम्न डेटा फिट बैठता है: enter image description here

मैं एक रेखीय प्रतिगमन फिट जो स्पष्ट रूप से काम नहीं किया है, क्योंकि यह औसत ले लिया उपयोग करने की कोशिश। मैंने RANSAC को यह भी सोचने की कोशिश की कि चोटियों के पास अधिक डेटा है। यह थोड़ा रेखीय प्रतीपगमन की तुलना में बेहतर काम किया है लेकिन विधि से दोषपूर्ण है के रूप में जब अधिक अंक गलत क्षेत्रों में मौजूद कई बार कर रहे हैं।

किसी को भी एक अच्छा तरीका पता है सिर्फ इस डेटा के लिए चोटियों फिट करने के लिए?

वर्तमान में, मैं 10 अलग-अलग क्षेत्रों में और प्रत्येक क्षेत्र में 500 डेटा बिंदुओं में विभाजित करने की सोच रहा हूँ सबसे बड़ा मान पाते हैं। अंत में, मेरे पास 50 अंक होना चाहिए जो मैं उपर्युक्त वर्णित किसी भी घातीय विधि का उपयोग कर फिट कर सकता हूं। आप इस विधि के बारे में क्या सोचते हैं?

उत्तर

1

सोचा मैं हर संभावित समाधान है कि काम कर सकते हैं की एक अद्यतन देना चाहते हैं। जैसा कि पहले उल्लेख, डेटा अलग 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); 

enter image description here

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; 

enter image description here

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); 

enter image description here

अवधि

इस में 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 डेटा बिंदुओं: Using all 500 data points

पहले 150 डेटा बिंदुओं का उपयोग करना: enter image description here

के साथ काल में 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 डेटा बिंदुओं के लिए शिखर ले और फिर ग का मतलब ले enter image description here

यहाँ मैं हर 25 डेटा बिंदुओं के लिए शिखर ले और फिर ग की औसत ले enter image description here

यहाँ मैं हर 10 डेटा बिंदुओं के लिए शिखर ले और फिर ग enter image description here

0

मुख्य लक्ष्य फिट से उदासीनता पैरामीटर को निकालने के लिए है, तो हो सकता है आप अपने डेटा को सीधे फिटिंग एक damped साइन वक्र पर विचार करना चाहते। कुछ इस तरह (वक्र फिटिंग उपकरण के साथ बनाया):

[xData, yData] = prepareCurveData(x, y); 
ft = fittype('a + sin(b*x - c).*exp(d*x)', 'independent', 'x', 'dependent', 'y'); 
opts = fitoptions('Method', 'NonlinearLeastSquares'); 
opts.Display = 'Off'; 
opts.StartPoint = [1 0.285116122712545 0.805911873245316 0.63235924622541]; 
[fitresult, gof] = fit(xData, yData, ft, opts); 
plot(fitresult, xData, yData); 

विशेष रूप से अपने उदाहरण डेटा के कुछ के बाद से वास्तव में (शोर से ऊपर) दिलचस्प क्षेत्र में कई डेटा बिंदुओं की जरूरत नहीं है।

यदि आपको वास्तव में प्रयोगात्मक डेटा की अधिकतम सीमा तक सीधे फिट करने की आवश्यकता है, तो आप केवल अधिकतम अधिकतम चुनने के लिए findpeaks फ़ंक्शन का उपयोग कर सकते हैं और फिर उन्हें फिट कर सकते हैं। आप अपनी जरूरतों को समायोजित करने के लिए MinPeakProminence पैरामीटर के साथ थोड़ा सा खेलना चाह सकते हैं।

+0

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

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