Setting bounds for constants in a fit() object in terms of other constants in the fit object
Hello, I am currently trying to fit experimental data that I theorize fits a logarithmic function.
To this end, I am using the fit() and fitoptions() function in order to create a logarithmic equation.
Since the default MATLAB logarithmic fit model does not seem to account for horizontal translation and scaling, I have created a custom fit type as seen below:
shiftedLog = fittype(‘A*log((B*x)-C) + D’, ‘independent’, ‘x’, ‘coefficients’, {‘A’,’B’,’C’,’D’});
% set the bounds
opts.StartPoint = […]; % Initial guesses for [A, B, C, D]
opts.Lower = […]; % Lower bounds for [A, B, C, D]
opts.Upper = […]; % Upper bounds for [A, B, C, D]
I have noticed that when I try to run this program, I have ran into errors where the fit object returns either infinity or a complex value.
Since the log() function is defined only when its inner argument > 0, I need to specify the bounds for variables B and C to keep the entire argument positive.
However, When I try to specify the bounds in terms of the constants of the fit object, for example:
opts.Lower = [-Inf, C/min(x),…]
MATLAB gives me an error.
I know that in the main script code, the constants A, B, C, and D are not standalone variables so the main script has this issue, but as (to my knowledge) fit() finds the best values for the constants through an iterative process. Given this, It is impractical to specify a hard-coded value for the limits.
How should I approach this problem? Is there another way to find fit of a logarithmic function that incorporates ‘shifting’ and ‘stretching’ in both horizontal and vertical directions? Or is there a workaround? Thank you in advance.Hello, I am currently trying to fit experimental data that I theorize fits a logarithmic function.
To this end, I am using the fit() and fitoptions() function in order to create a logarithmic equation.
Since the default MATLAB logarithmic fit model does not seem to account for horizontal translation and scaling, I have created a custom fit type as seen below:
shiftedLog = fittype(‘A*log((B*x)-C) + D’, ‘independent’, ‘x’, ‘coefficients’, {‘A’,’B’,’C’,’D’});
% set the bounds
opts.StartPoint = […]; % Initial guesses for [A, B, C, D]
opts.Lower = […]; % Lower bounds for [A, B, C, D]
opts.Upper = […]; % Upper bounds for [A, B, C, D]
I have noticed that when I try to run this program, I have ran into errors where the fit object returns either infinity or a complex value.
Since the log() function is defined only when its inner argument > 0, I need to specify the bounds for variables B and C to keep the entire argument positive.
However, When I try to specify the bounds in terms of the constants of the fit object, for example:
opts.Lower = [-Inf, C/min(x),…]
MATLAB gives me an error.
I know that in the main script code, the constants A, B, C, and D are not standalone variables so the main script has this issue, but as (to my knowledge) fit() finds the best values for the constants through an iterative process. Given this, It is impractical to specify a hard-coded value for the limits.
How should I approach this problem? Is there another way to find fit of a logarithmic function that incorporates ‘shifting’ and ‘stretching’ in both horizontal and vertical directions? Or is there a workaround? Thank you in advance. Hello, I am currently trying to fit experimental data that I theorize fits a logarithmic function.
To this end, I am using the fit() and fitoptions() function in order to create a logarithmic equation.
Since the default MATLAB logarithmic fit model does not seem to account for horizontal translation and scaling, I have created a custom fit type as seen below:
shiftedLog = fittype(‘A*log((B*x)-C) + D’, ‘independent’, ‘x’, ‘coefficients’, {‘A’,’B’,’C’,’D’});
% set the bounds
opts.StartPoint = […]; % Initial guesses for [A, B, C, D]
opts.Lower = […]; % Lower bounds for [A, B, C, D]
opts.Upper = […]; % Upper bounds for [A, B, C, D]
I have noticed that when I try to run this program, I have ran into errors where the fit object returns either infinity or a complex value.
Since the log() function is defined only when its inner argument > 0, I need to specify the bounds for variables B and C to keep the entire argument positive.
However, When I try to specify the bounds in terms of the constants of the fit object, for example:
opts.Lower = [-Inf, C/min(x),…]
MATLAB gives me an error.
I know that in the main script code, the constants A, B, C, and D are not standalone variables so the main script has this issue, but as (to my knowledge) fit() finds the best values for the constants through an iterative process. Given this, It is impractical to specify a hard-coded value for the limits.
How should I approach this problem? Is there another way to find fit of a logarithmic function that incorporates ‘shifting’ and ‘stretching’ in both horizontal and vertical directions? Or is there a workaround? Thank you in advance. curve fitting, function MATLAB Answers — New Questions