how to fit non linear equation with ten parameters

2 visualizzazioni (ultimi 30 giorni)
Hi everyone,
I have to computed ten parameters in non linear equation, I tryied to use 'nlinfit' command but I obtain the following error:
Error using nlinfit (line 219)
MODELFUN must be a function that returns a vector of fitted values the same size as Y (30615-by-1). The
model function you provided returned a result that was 1-by-1.
One common reason for a size mismatch is using matrix operators (*, /, ^) in your function instead of the
corresponding elementwise operators (.*, ./, .^).
Error in C_Fourier_Analysis (line 58)
F_fitted = nlinfit(x,y,f,[1 1 2*pi*rand 1 2*pi*rand 1 1 2*pi*rand 1 2*pi*rand]);
I'm attacching the complete code and the data. Thanks.
format long g
folderData = 'C:\Users\Valerio\Desktop\TRAINEESHIP\data\ACCESS1.0';
filePattern = fullfile(folderData, '*.xlsx');
xlsFiles = dir(filePattern);
nFiles = length(xlsFiles);
for ii = 1:nFiles
filename = fullfile(xlsFiles(ii).folder, xlsFiles(ii).name);
files{ii} = xlsread(filename);
end
IPCC = files(1);
ERA5 = files(2);
IPCC_data = unique(IPCC{:,1},'rows');
ERA5_data = unique(ERA5{:,1},'rows');
dt_IPCC = datetime([IPCC_data(:,1:3) IPCC_data(:,4)/1E4 repmat([0 0],size(IPCC_data,1),1)]);
dt_ERA5 = datetime([ERA5_data(:,1:4) repmat([0 0],size(ERA5_data,1),1)]);
[~,ia,ie] = intersect(dt_IPCC,dt_ERA5);
tt_IPCC_ERA5 = timetable(dt_IPCC(ia),IPCC_data(ia,5:end),ERA5_data(ie,5:end));
tt_IPCC_ERA5.Properties.VariableNames = {'IPCC','ERA5'};
IPCC = tt_IPCC_ERA5.IPCC;
ERA5 = tt_IPCC_ERA5.ERA5;
y = ERA5(:,1); %Hs from ERA5
dir_ERA5 = ERA5(:,3);
x1 = IPCC(:,1); %Hs from IPCC
x2 = IPCC(:,3); %Dir from IPCC
Tm_IPCC = IPCC(:,2);
Tm_ERA5 = ERA5(:,2);
figure
scatter(dir_ERA5,x2,'g');
xlabel('Dir ERA5');
ylabel('Dir IPCC');
title('Linear regression between directions');
%Plot regression linear line
dir_ERA5(isnan(x2)) = [] ;
x2(isnan(x2)) = [] ;
P = polyfit(dir_ERA5,x2,1);
x0 = min(dir_ERA5) ; x3 = max(dir_ERA5) ;
xi = linspace(x0,x3) ;
yi = P(1)*xi+P(2);
hold on
plot(xi,yi,'b');
%Computing linear regression parameters
lin_param = fitlm(dir_ERA5,x2);
Pearson = lin_param.Rsquared;
Error_R = lin_param.RMSE;
%Fourier Analysis
x = [x1', x2'];
f = @(F,x)(F(1)+F(2)*cos(2*pi*(x(:,2)./360)-F(3))+F(4)*cos(4*pi*(x(:,2)./360)-F(5))).*x(:,1).^(F(6)+F(7)*cos(2*pi*(x(:,2)./360)-F(8))+F(9)*cos(4*pi*(x(:,2)./360)-F(10)));
F_fitted = nlinfit(x,y,f,[1 1 2*pi*rand 1 2*pi*rand 1 1 2*pi*rand 1 2*pi*rand]);

Risposta accettata

Ameer Hamza
Ameer Hamza il 25 Mar 2020
This error is caused because vector created by this line is
x = [x1', x2'];
1*x, however, it seems that you expected it to be x*2 matrix. Changing the line to
x = [x1, x2];
will solve this issue. However, after this, there is another issue related to your function f returning inf and nan. To resolve that, you will need to check the issue with your equation.
  3 Commenti
Ameer Hamza
Ameer Hamza il 25 Mar 2020
It has to do with the complexity of your model. MATLAB is having difficulity to find a fit to your dataset. I tried few things but couldn't able to solve this issue. Trying to simplify the model will be helpful.

Accedi per commentare.

Più risposte (0)

Categorie

Scopri di più su MATLAB in Help Center e File Exchange

Prodotti


Release

R2018b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by