2016-08-08 33 views
0

私はMATLABの正弦関数の合計にいくつかのデータを収めようとしていますが、MATLABの正弦関数の項数は限られています。 1≦n≦8ですが、フィット関数には50項以上の項が必要です。とにかくMATLABを使って8つの正弦波項を持つ正弦関数の合計にデータをフィットさせる方法はありますか?なぜMATLABにそのような制約があるのですか(それは技術的にも恣意的でもあります)?シヌソイド関数に適合するツールボックスはありますか(特に、データをサポートできるもの)?MATLABのカーブフィッティング、8項以上の正弦波関数用?

>f = fit(X,Y, 'sin10') 
>Error using fittype>iCreateFromLibrary (line 412) 
>Library function sin10 not found. 

「sin8」または「sin9」パラメータまではo.kです。

すべての回答に感謝します。

+1

http://www.mathworks.com/help/curvefit/fourier.htmlの代わりにフーリエフィッティングを使用しますか?searchHighlight = fourier%20fitting 8つ以上の用語については、自分自身で実装する必要があります。しかしながら、フーリエフィッティングの8項はおそらくほとんどの場合十分である。 – NKN

+0

コメントをいただきありがとうございます、フーリエのprobleはthatmフーリエが位相を考慮しておらず、セグメント化されたデータでは漏れと呼ばれるものがあります。それだけでなく、あなたが8項に限定して言及したように、それは十分ではないように思われます。 – MimSaad

答えて

0

上記の問題(例えばfit(xdata,ydata,'sin6'))フィッティングSum of Sinesに指定された引数で、Iは、MATLAB fit関数を使用することで、容易に最適解に収束し、フィッティングの結果は以下のように許容可能である: Image 1

が、私は習慣的定義関数を使用して同じデータに合うようにしようとしたとき、あなたは下の図に見るように、結果は全く満足のいくものではない。

[email protected](x,xdata)a1*sin(b1*xdata+c1)+...+a6*sin(b6*xdata+c6); %Sum if Six Sines 
f=fit(xdata,ydata,fun); 

Image 2

まず、私はそれがあると感じましたfit命令のように、私はlsqcurvefitのような他の命令を試してみましたが、いくつかのデータではうまくいきました。 Maltabの文書から、Sum of SineフィッティングとFourierフィッティングは、開始点または初期点、またはフィッティングアルゴリズムが最初の反復のフィッティングパラメータ(振幅、周波数および位相)について想定する値に非常に敏感です。 Matlabフィッティングツールボックス.mファイルを調べると、matlabはあらかじめ定義された関数フィッティングを使用するときに起点を得るために巧妙なやり方をしていることに気付きました(たとえばfit(x,y,'sin1'), or fit(x,y,'sin2'),...ですが、カスタム関数を入力するとランダムに生成されます) (同じ関数を入力したとしても) ちなみに、MatlabはydataのFFTを計算し、いくつかの(貪欲に思われる)方法で、振幅、周波数、位相の初期点を抽出しますstartpt.m

0

私はMATLABのヘルプをブラウズしている間、誤って私の質問に対する解決策を見つけました。私は、同じ問題を抱えている人々を援助したいと考えてこの回答を投稿します。

これを解決するための最初の試みとして、私は「フィット」命令を試みました。 「

FitOptions = fitoptions('Method','NonlinearLeastSquares', 'Algorithm', 'Trust-Region', 'MaxIter'); 
FitType = fittype('a*sin(1*f) + b*sin(2*f) + c*sin(3*f) + d*sin(4*f) + e*sin(5*f) + g*sin(6*f) + h*sin(7*f) + k*sin(8*f) + l*sin(9*f) + m*sin(10*f) + n*sin(11*f)', 'independent', 'f'); 
[FittedModel, GOF] = fit(freq, data, FitType) 
% `In above code, phase parameters are not included, they might be added. 

私は何を見つけることは最適化ツールボックスから「lsqcurvefitは」命令を使用して、カスタマイズされた関数フィッティングがより実現可能かつ容易なことである。いくつかの理由から、カスタマイズされた、以下のようなベースのフィッティングコードを「フィット」ワークアウトしませんでしたフィット関数。 (今まで)満足のいくものである、それは以下に示されて

clear;clc 
xdata=1:0.1:10; % X or Independant Data 
ydata=sin(xdata+0.2)+0.5*sin(0.3*xdata+0.3)+ 2*sin(0.2*xdata+23)+... 
    0.7*sin(0.34*xdata+12)+.76*sin(.23*xdata+.3)+.98*sin(.76 *xdata+.56)+... 
    +.34*sin(.87*xdata+.123)+.234*sin(.234 *xdata+23); % Y or Dependant data 
x0 = randn(36,1); % Initial Guess 
fun = @(x,xdata)x(1)*sin(x(2)*xdata+x(3))+... 
       x(4)*sin(x(5)*xdata+x(6))+... 
       x(7)*sin(x(8)*xdata+x(9))+... 
       x(10)*sin(x(11)*xdata+x(12))+... 
       x(13)*sin(x(14)*xdata+x(15))+... 
       x(16)*sin(x(17)*xdata+x(18))+... 
       x(19)*sin(x(20)*xdata+x(21))+... 
       x(22)*sin(x(23)*xdata+x(24))+... 
       x(25)*sin(x(26)*xdata+x(27))+... 
       x(28)*sin(x(29)*xdata+x(30))+... 
       x(31)*sin(x(32)*xdata+x(33))+... 
       x(34)*sin(x(35)*xdata+x(36)); % Goal function which is Sum of 12 sines 
options = optimoptions('lsqcurvefit','Algorithm','trust-region-reflective');% Options for fitting 
x=lsqcurvefit(fun,x0,xdata,ydata) % the main instruction 
times = linspace(xdata(1),xdata(end)); 
plot(xdata,ydata,'ko',times,fun(x,times),'r-') 
legend('Data','Fitted Sum of 12 Sines') 
title('Data and Fitted Curve') 

結果::私は(> 8)コードの下での正弦12の合計に私のデータを合わせてそれをテストし

result