Filter löschen
Filter löschen

Using fittype with a symbolic function

20 Ansichten (letzte 30 Tage)
Emily
Emily am 18 Okt. 2023
Beantwortet: Torsten am 19 Okt. 2023
I have a symbolic function that is the result of a couple of symbolic integrations and some other manipulation. To give you some idea, here it is expressed to two digits:
vpa(qME,2)
ans =
0.28*real(exp(2.7e-4*prob_10)*exp(prob_10^(1/2)*exp(-phi_10*1.0i)*(1.0 - 1.0*prob_10)^(1/2)*(- 0.9 + 7.1e-4i))*exp(prob_10^(1/2)*exp(phi_10*1.0i)*(1.0 - 1.0*prob_10)^(1/2)*(- 0.9 - 7.1e-4i)))
And it is a function of two symbolic variables:
symvar(qME)
ans =
[phi_10, prob_10]
I also have some data on a 100 by 100 grid, created with accumarry (it is a probability distribution).
size(ProbinBinsNoZero)
ans =
100 100
I have set up a grid:
[x,y] = meshgrid(1:size(ProbinBinsNoZero',2), 1:size(ProbinBinsNoZero',1));
The grid above represents a discretization of the region and . So I'll need to normalize x and y for them to represent prob_10 and phi_10.
I'd like to fit the data in ProbinBinsNoZero with the function
offset + scale*qME
so I ran the command:
fitMaxEnt = fittype( @(offset, scale) (offset+scale*qME), 'independent', {'phi_10','prob_10'} );
and matlab complains:
The independent variable phi_10 does not appear in the equation expression.
Use phi_10 in the expression or indicate another variable as the independent variable.
presumably because even though I named the independent variables the same thing as the sym variables, they are not really the same thing?
If the fittype had worked, I would have then used:
[sfMaxEnt, gofMaxEnt] = fit([2*pi*x(:)/100, y(:)/100],ProbinBinsNoZero(:),fitMaxEnt)
(though I haven't tested this and am not sure this is the proper way to normalize x and y).
I also tried creating a function handle:
hqME = matlabFunction(qME);
and using that in place of qME in the definition of the fit type, but that didn't help.
Can you please tell me the proper way to use a symbolic function in fittype, in order to fit my data?
Or how to change the symbolic function into one that I can use in fittype?
Thanks!

Akzeptierte Antwort

Torsten
Torsten am 19 Okt. 2023
The problem was solved by converting the symbolic function "qme" to a numerical function handle by using
qme_numeric = matlabFunction(qme);
and definining the function to be fitted (with fitting parameters offset and scale) as
qme2 = @(offset,scale,phi_10,prob_10) offset + scale*qme_numeric(phi_10,prob_10);
Then the call to fittype and fit worked:
fitMaxEnt = fittype(@(offset,scale,phi_10,prob_10)qme2(offset,scale,phi_10,prob_10), 'independent', {'phi_10','prob_10'} );
[sfMaxEnt, gofMaxEnt] = fit([2*pi*x(:)/100, y(:)/100],ProbinBinsNoZero(:),fitMaxEnt)
  1 Kommentar
Emily
Emily am 19 Okt. 2023
Verschoben: Star Strider am 19 Okt. 2023
qme2 = @(offset,scale,phi_10,prob_10) offset + scale*qme_numeric(phi_10,prob_10)
qme2 =
function_handle with value:
@(offset,scale,phi_10,prob_10)offset+scale*qme_numeric(phi_10,prob_10)
>> qme2(1,0.5,1,1)
ans =
1.139428821070130
and now my fittype is successful:
fitMaxEnt = fittype(@(offset,scale,phi_10,prob_10)qme2(offset,scale,phi_10,prob_10), 'independent', {'phi_10','prob_10'} );
[sfMaxEnt, gofMaxEnt] = fit([2*pi*x(:)/100, y(:)/100],ProbinBinsNoZero(:),fitMaxEnt)
Warning: Start point not provided, choosing random start point.
> In curvefit.attention/Warning/throw (line 30)
In fit>iFit (line 318)
In fit (line 117)
General model:
sfMaxEnt(phi_10,prob_10) = qme2(offset,scale,phi_10,prob_10)
Coefficients (with 95% confidence bounds):
offset = -6.688e-05 (-6.795e-05, -6.58e-05)
scale = 0.0005243 (0.0005213, 0.0005273)
gofMaxEnt =
struct with fields:
sse: 6.191350836297529e-06
rsquare: 0.920723255003681
dfe: 9998
adjrsquare: 0.920715325743330
rmse: 2.488491381172208e-05
figure; plot(sfMaxEnt,[2*pi*x(:),y(:)]/100,(ProbinBinsNoZero(:)));
Thank you Torsten! Would you like to write up an answer for me to accept? And would you like to explain what is different between the versions that worked and those that didn't? I am not used to thinking about functions in matlab, so the syntax is sort of mysterious for me. If not I can just make an answer with the correct syntax based on your comments.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Mehr zu Linear and Nonlinear Regression finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by