如何将傅立叶级数拟合到超过8个系列的部分?
我尝试这种程序化但我得到的系数值不一样且拟合不好
%% Create a Fourier series
AnCosWnx='A0';
BnSinWnx='';
lower=1;
upper=1;
startpoint=0;
for n=1:9
LCos=AnCosWnx;
LSin=BnSinWnx;
ACosWx=strcat('A',num2str(n),'*cos(w*',num2str(n),'*x)');
AnCosWnx=strcat(LCos,'+',ACosWx);
BSinWx=strcat('B',num2str(n),'*sin(w*',num2str(n),'*x)');
BnSinWnx=strcat(LSin,'+',BSinWx);
Fx=strcat(AnCosWnx,BnSinWnx);
end
%% build the fit function
options = fitoptions(Fx);
lower=zeros(1,2+n*2);
upper=zeros(1,2+n*2);
startpoint=zeros(1,2+n*2);
lower(1:end)=-inf;
upper(1:end)=inf;
startpoint(end)=6.17*10^-3;
set(options,'Lower',lower,...
'Upper',upper...
,'StartPoint',startpoint...
,'Algorithm','Trust-Region');
%%
ft = fittype(Fx);
% Fit this model using new data
[fitobject ,gof,output] = fit(sat,dat,ft,options);
%%为字符串
创建拟合函数 cvalues = coeffvalues(fitobject);
cnames = coeffnames(fitobject);
output = formula(fitobject);
for ii=1:1:numel(cvalues)
cname = cnames{ii};
cvalue = num2str(cvalues(ii));
output = strrep(output, cname , cvalue);
end
%%将输出字符串转换为函数 Foutput = strcat('@(x)',输出);
Fout= regexprep(Foutput,'\r\n|\n|\r','')
g=str2func(Fout);
hold on
h_ = plot(sat,g(sat),'r')
答案 0 :(得分:1)
根据我的经验,matlab(或任何)曲线拟合算法通常不会在某种复杂的函数之上工作。您可以使用分段样条,但似乎periodogram可能是最佳解决方案。这是一种将傅立叶级数拟合为非均匀数据的技术。 exchange上有一个matlab函数。