How can I use a vector as a problem-dependent variable for fittype

6 ビュー (過去 30 日間)
N/A
N/A 2012 年 9 月 7 日
回答済み: Aditya 2025 年 2 月 6 日 6:51
General task description: Programatically fit a series of experimental data sets using a custom equation describing the data as a superposition of two curves.
What's the issue: Vectors are not being recognized in the problem argument of fittype. I have seen on the help file that the program argument is a cell array with one element per problem constant. Is there a way to input a vector to be used in the fit equation? I also seem to be having the same issue passing the X vector into the fit equation. As you will see, I rely on knowing the length of X to construct the fit vector.
Notes: The two curves used to fit the data are named I_1 and I_2 below. The scaling constants are named sc_1 and sc_2. A third scaling constant is used to scale the entire superposition and is named sc_tot. As you will see, "abc_Superpos.m" is run first which then calls the other m files, also shown below.
The Code:
abc_Superpos.m %below are the contents of this m file
% The first part of this code is included to have sample data to run the rest of the code. My real curves are from experimental data, not calculated from a function.
clear all X = (1:31); num_X_points = 31; num_curves = 5;
for dat_r = 1:num_curves for dat_c = 1:length(X) I_1_all_data(dat_r,dat_c) = X(dat_c)^2; I_2_all_data(dat_r,dat_c) = exp(-X(dat_c)); end end I_mix_all_data = 3*I_1 + I_2;
for incr = 1:num_curves
I_1(incr,:) = I_1_all_data(incr,:); %component 1
I_2(incr,:) = I_2_all_times(incr,:); %component 2
I_mix(incr,:) = I_mix_all_data(incr,:); %mix
abc_Superpos_cf_ = abc_Superpos_fcn(X,I_mix,I_1,I_2);
end
----------------------------------
abc_Superpos_fcn(X,Y,I_1,I_2).m %below are the contents of this m file
function [abc_Superpos_cf_] = abc_Superpos_fcn(X,Y,I_1,I_2)
X = X(:);
Y = Y(:);
ex_ = false(length(X),1); ex_([]) = 1; ex_ = ex_ | (Y <= 0);
fo_ = fitoptions('Weight',Y,'Algorithm', 'Trust-Region', 'method','NonlinearLeastSquares',... 'Lower',[0 0 0],'Upper', [1000 1000 1000], 'MaxFunEvals', 10000,'MaxIter',10000,... 'TolFun', 1e-10, 'TolX', 1e-10, 'DiffMinChange', 1e-10, 'DiffMaxChange', 1e-7); ok_ = isfinite(X) & isfinite(Y) & isfinite(Y); st_ = [1 1 1]; set(fo_,'Startpoint',st_);
ft_ = fittype('abc_EQN_Superpos_fcn(I_1,I_2,sc_1,sc_2,sc_tot,X)',... 'dependent',{'Y'},'independent',{'X'},... 'coefficients',{'sc_1','sc_2','sc_tot'}, 'problem',{'I_1', 'I_2'});
if sum(~ex_(ok_))<2
error('Not enough data left to fit ''%s'' after applying exclusion rule ''%s''.','fit 1','nozeros')
else
abc_Superpos_cf_ = fit(X(ok_),Y(ok_),ft_,fo_);
end
if 0 cv_ = { 0.1011653947332, 7.519747020586, 0.0006793571606672}; abc_Superpos_cf_ = cfit(ft_,cv_{:}); end
----------------------------------------------
abc_EQN_Superpos_fcn.m %below are the contents of this m file
function [abc_EQN_Superpos_cf_] = abc_EQN_Superpos_fcn(I_1,I_2,sc_1,sc_2,sc_tot,X)
I_em_specfit_superpos = zeros(x_range); for X_index = 1:x_range I_em_specfit_superpos(X_index) = (sc_1*I_1(X_index) + sc_2*I_2(X_index)); end
abc_EQN_Superpos_cf_ = sc_tot * I_em_specfit_superpos;

回答 (1 件)

Aditya
Aditya 2025 年 2 月 6 日 6:51
Hi,
To address the issues you're experiencing with fitting a series of experimental data sets using a custom equation in MATLAB, there are a few areas to focus on, particularly with passing vectors to fittype and ensuring the fit function handles vector inputs appropriately. Here’s an updated approach to ensure your code works as intended:
  • abc_Superpos.m
clear all;
X = (1:31);
num_X_points = 31;
num_curves = 5;
for dat_r = 1:num_curves
for dat_c = 1:length(X)
I_1_all_data(dat_r, dat_c) = X(dat_c)^2;
I_2_all_data(dat_r, dat_c) = exp(-X(dat_c));
end
end
I_mix_all_data = 3 * I_1_all_data + I_2_all_data;
for incr = 1:num_curves
I_1 = I_1_all_data(incr, :); % component 1
I_2 = I_2_all_data(incr, :); % component 2
I_mix = I_mix_all_data(incr, :); % mix
abc_Superpos_cf_ = abc_Superpos_fcn(X, I_mix, I_1, I_2);
end
  • abc_Superpos_fcn.m
function [abc_Superpos_cf_] = abc_Superpos_fcn(X, Y, I_1, I_2)
X = X(:);
Y = Y(:);
ex_ = false(length(X), 1);
ex_([]) = 1;
ex_ = ex_ | (Y <= 0);
fo_ = fitoptions('Weight', Y, 'Algorithm', 'Trust-Region', 'Method', 'NonlinearLeastSquares', ...
'Lower', [0 0 0], 'Upper', [1000 1000 1000], 'MaxFunEvals', 10000, 'MaxIter', 10000, ...
'TolFun', 1e-10, 'TolX', 1e-10, 'DiffMinChange', 1e-10, 'DiffMaxChange', 1e-7);
ok_ = isfinite(X) & isfinite(Y);
st_ = [1 1 1];
set(fo_, 'Startpoint', st_);
ft_ = fittype('abc_EQN_Superpos_fcn(I_1, I_2, sc_1, sc_2, sc_tot, X)', ...
'dependent', {'Y'}, 'independent', {'X'}, ...
'coefficients', {'sc_1', 'sc_2', 'sc_tot'}, 'problem', {'I_1', 'I_2'});
if sum(~ex_(ok_)) < 2
error('Not enough data left to fit after applying exclusion rule.');
else
abc_Superpos_cf_ = fit(X(ok_), Y(ok_), ft_, fo_, 'problem', {I_1, I_2});
end
end
  • abc_EQN_Superpos_fcn.m
function [abc_EQN_Superpos_cf_] = abc_EQN_Superpos_fcn(I_1, I_2, sc_1, sc_2, sc_tot, X)
I_em_specfit_superpos = sc_1 * I_1 + sc_2 * I_2;
abc_EQN_Superpos_cf_ = sc_tot * I_em_specfit_superpos;
end
This setup should resolve the issues related to vector handling in your fit function. Adjust the constraints and initial conditions as necessary based on your specific data and fitting requirements.

カテゴリ

Help Center および File ExchangeLinear and Nonlinear Regression についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by