Wolfram Function Repository
Instant-use add-on functions for the Wolfram Language
Function Repository Resource:
Fit multiple datasets with multiple expressions that share parameters
ResourceFunction["MultiNonlinearModelFit"][{dat1,dat2,…},{form1,form2,…},{β1,…},{x1,…}] is a generalized form of NonlinearModelFit where each dataset dati is fitted with expression formi. The expressions are allowed to share parameter values βi with each other. | |
ResourceFunction["MultiNonlinearModelFit"][{dat1,dat2, …}, <|"Expressions"→{form1,form2,…}, "Constraints"→cons |>, {β1,…},{x1,…}] fits the model subject to parameter constraints cons. |
Fit some random data to simple linear models with a shared slope parameter:
In[1]:= |
Out[4]= |
In[5]:= |
Out[5]= |
Fit the same model with parameter constraints to allow for a small difference between the slopes of the lines (this works best by using a quadratic form for the difference between the slope parameters, since (a1-a2)2is differentiable whereas Abs[a1–a2] is not):
In[6]:= |
Out[6]= |
In[7]:= |
Out[7]= |
It is possible to define a fitting function that evaluates to a list of values equal to the number of datasets when provided with numerical parameters:
The fit function does not evaluate symbolically, only numerically:
In[8]:= |
Out[8]= |
In[9]:= |
Out[9]= |
Use this function to fit with:
In[10]:= |
Out[10]= |
In[11]:= |
Out[11]= |
Fit two Gaussian peaks with a shared location parameter:
In[12]:= |
Out[13]= |
Fit with the models that were used to generate the data:
In[14]:= |
Out[14]= |
In[15]:= |
Out[15]= |
Extract the fits as a list of expressions:
In[16]:= |
Out[16]= |
Compare the fits to the data:
In[17]:= |
Out[17]= |
The Weights option can be specified in a number of ways. First generate datasets with an unequal number of points and offset them slightly:
In[18]:= |
Out[19]= |
Fit the data normally. In this case, each individual data point has equal weights in the fit, so the first dataset gets more weight overall since it has more points:
In[20]:= |
Out[21]= |
In[22]:= |
Out[22]= |
Assign more weight to the second dataset:
In[23]:= |
Out[24]= |
In[25]:= |
Out[25]= |
Assign weights inversely proportional to the number of points in the dataset. This asserts that each dataset is equally important:
In[26]:= |
Out[27]= |
In[28]:= |
Out[28]= |
To assign weights for each individual data point, you can pass a list of vectors matching the input data:
In[29]:= |
Out[30]= |
In[31]:= |
Out[31]= |
Use a different symbol to index the datasets:
In[32]:= |
Out[33]= |
In[34]:= |
Out[34]= |
This work is licensed under a Creative Commons Attribution 4.0 International License