Improving fit of custom function

2 views (last 30 days)
mz86
mz86 on 14 May 2019
Answered: Rajendra Gupta on 27 May 2020
Hi everyone,
I would like to fit a dataset to a custom equation. Equation:
function_lab.PNG
I used cftool and chose custom equation and specified the function: A+m*x+(B+n*x)/(1+10^-[(x-C)/D]) :
Q1.PNG
How can I improve the fit? In paricular I would like the beginning of the curve to follow the data points much better. I am sure there are better functions to fit this dataset to, but I require to use the equation given to analyze and extract parameters C and D in particular.
I have attached the data in a .txt file.
Appreciate any help!

Answers (2)

Rajendra Gupta
Rajendra Gupta on 27 May 2020
Alex Shaw's parameter determination for this problem is very different from what 'mz86' obtained from the Matlab curve fitting tool. Why is it so? I too find problems in fitting my custom equations that involve integrals. Also, Alex Shaw only provides the parameters, not the 95% confidence bounds for each parameters. What is the difference in the two approaches that yield drastically different parameters for fitting the same data using the same equation? How can I replicate the fits and parameter results obtained by Alex so that I could try to implement the same approach to my curve fitting problem?
Your early response will be gratefully appreciated.
Thank you.
Here is one of my custom equation to fit 1048 data points with errors. Excel data file is attached.
y=VPCexp(x,Om0,299840/H0,a)+5*log10(1+x)+25
function [y] = VPCexp(z,Om0,R0,a)
n = length(z);
y=zeros(size(z));
for i=1:n
zl=z(i);
fun = @(x) (Om0.*((1+x).^3.*exp(a./3.*(1-(1+x).^(-3)))-exp(2.*a./3.*(1-(1+x).^(-3))))+(1+x).^2).^-0.5;
yl = integral(fun,0,zl);
dP=R0*sinh(yl/exp(-a/3*(1-(1+zl)^(-3))));
y(i)= 5*log10(dP);
end
The fit I get is as follows:
General model:
f(x) = VPCexp(x,Om0,299840/H0,a)+5*log10(1+x)+25
Coefficients (with 95% confidence bounds):
H0 = 71.24 (70.47, 72.01)
Om0 = 0.5749 (0.3704, 0.7793)
a = 0.8509 (0.6572, 1.045)
Goodness of fit:
SSE: 1034
R-square: 0.997
Adjusted R-square: 0.997
RMSE: 0.9948

Alex Sha
Alex Sha on 24 May 2019
Hi, what is the function you want to fit?
y= A+m*x+(B+n*x)/(1+10^(-((x-C)/D)))
or
y= A+m*x+(B+n*x)/(1+exp(-((x-C)/D)))
if the former:
Root of Mean Square Error (RMSE): 172.220715864347
Sum of Squared Residual: 5783695.11970149
Correlation Coef. (R): 0.99832342215494
R-Square: 0.996649655223151
Adjusted R-Square: 0.996614755798392
Determination Coef. (DC): 0.996649655223151
Chi-Square: 926.211553161795
F-Statistic: 11244.6209348302
Parameter Best Estimate
---------- -------------
a 11846.2854391282
m 24.3940304694188
b -1.64416859185817E18
n -8.09054974984671E17
c -83.4293845593878
d -5.89360891288855
if the later:
Root of Mean Square Error (RMSE): 172.220715864346
Sum of Squared Residual: 5783695.11970144
Correlation Coef. (R): 0.998323422154939
R-Square: 0.996649655223149
Adjusted R-Square: 0.99661475579839
Determination Coef. (DC): 0.996649655223151
Chi-Square: 926.211451996129
F-Statistic: 11244.6209212544
Parameter Best Estimate
---------- -------------
a 11846.2854211205
m 24.3940307991782
b -6.12857667267666E17
n -3.01572212177201E17
c -80.9034614293268
d -2.55956180987299
c159.jpg

Categories

Find more on Linear and Nonlinear Regression in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!