I have a model called qobs:
qobs=0.039 ns (T (8.314 + (8.314 - 8.314 m) Hypergeometric2F1[1., 1/m,
1. + 1/m, (ns/ns∞)^m] +
8.314 Log[-1. (A E^((0.120279 ΔE)/T))^(-1./
m) (-1. + 1/(1. - 1. (ns/ns∞)^m))^(-1./
m) (1/(-1. + 1. (ns/ns∞)^m))^1. (ns/
ns∞)^(1. m) Psat[T]]) + 1. λp[T])
I have a set of data with two independent variables (ns and T):
Data = {{0, 85, 0}, {0.131592244, 85, 69.07308925}, {0.230286428, 85,
115.4518887}, {0.255592629, 85, 126.8281889}, {0.382123633, 85,
181.8483799}, {0.426409484, 85, 200.2798617}, {0.516246497, 85,
237.7531003}, {0.60102227, 85, 271.3000332}, {0.642777502, 85,
288.766803}, {0.749063545, 85, 329.4612163}, {0.760451336, 85,
332.9712438}, {0.762981956, 85, 334.6336615}, {0, 100,
0}, {0.074653293, 100, 39.4734225}, {0.111347284, 100,
57.64231052}, {0.127796314, 100, 65.7007577}, {0.212572087, 100,
104.7308741}, {0.269511039, 100, 130.1461666}, {0.29481724, 100,
141.0225864}, {0.408695144, 100, 189.1969421}, {0.523838358, 100,
236.109073}, {0.536491458, 100, 241.0802459}, {0.551675179, 100,
247.1796371}, {0.58710386, 100, 261.1558457}, {0.632655021, 100,
278.7613986}}
Other known values within the model are:
λp[85] = 6540
λp[100] = 6540
Psat[85] = 78896.6
Psat[100] = 323767
R = 8.314
I have tried using FindFit:
FindFit[Data, qobs, {ns∞, m, A, ΔE}, { ns, T}]
And I get the error code:
FindFit::nrlnum: "The function value {0.,-69.0731+0.0051321\ (85.\ (8.314 +8.314\ Log
[<<1>>])+1.\ λp[85.]),<<21>>,-261.156+0.0228971\ (100.\ (8.314 +8.314\ Log
[<<1>>])+1.\ λp[100.]),-278.761+0.0246735\ (100.\ (8.314 +8.314\ Log[<<1>>])+1.
\ λp[100.])} is not a list of real numbers with dimensions {25} at {ns
∞,m,A,ΔE} = {1.,1.,1.,1.}. "
I found, what I thought was a similar problem here how to avoid inducing complex numbers in FindFit
In particular the answer suggested by Oleksandr R. which involves splitting the model into explicitly real and imaginary parts and changing the data to force the imaginary part of the model to go to zero. Hence I changed my model to:
ComplexModel = Inner[#1[qobs] KroneckerDelta[i, #2] &, transformation,
Range@Length[transformation]]
where
transformation = {Re, Im}
and I reformatted my data to:
ComplexData = {{1, 0, 85, 0}, {1, 0.131592244, 85, 69.07308925}, {1,
0.230286428, 85, 115.4518887}, {1, 0.255592629, 85,
126.8281889}, {1, 0.382123633, 85, 181.8483799}, {1, 0.426409484,
85, 200.2798617}, {1, 0.516246497, 85, 237.7531003}, {1,
0.60102227, 85, 271.3000332}, {1, 0.642777502, 85, 288.766803}, {1,
0.749063545, 85, 329.4612163}, {1, 0.760451336, 85,
332.9712438}, {1, 0.762981956, 85, 334.6336615}, {1, 0, 100,
0}, {1, 0.074653293, 100, 39.4734225}, {1, 0.111347284, 100,
57.64231052}, {1, 0.127796314, 100, 65.7007577}, {1, 0.212572087,
100, 104.7308741}, {1, 0.269511039, 100, 130.1461666}, {1,
0.29481724, 100, 141.0225864}, {1, 0.408695144, 100,
189.1969421}, {1, 0.523838358, 100, 236.109073}, {1, 0.536491458,
100, 241.0802459}, {1, 0.551675179, 100, 247.1796371}, {1,
0.58710386, 100,
261.1558457}, {1, 0.632655021, 100, 278.7613986} {2, 0, 85, 0}, {2,
0.131592244, 85, 0}, {2, 0.230286428, 85, 0}, {2, 0.255592629, 85,
0}, {2, 0.382123633, 85, 0}, {2, 0.426409484, 85, 0}, {2,
0.516246497, 85, 0}, {2, 0.60102227, 85, 0}, {2, 0.642777502, 85,
0}, {2, 0.749063545, 85, 0}, {2, 0.760451336, 85, 0}, {2,
0.762981956, 85, 0}, {2, 0, 100, 0}, {2, 0.074653293, 100, 0}, {2,
0.111347284, 100, 0}, {2, 0.127796314, 100, 0}, {2, 0.212572087,
100, 0}, {2, 0.269511039, 100, 0}, {2, 0.29481724, 100, 0}, {2,
0.408695144, 100, 0}, {2, 0.523838358, 100, 0}, {2, 0.536491458,
100, 0}, {2, 0.551675179, 100, 0}, {2, 0.58710386, 100, 0}, {2,
0.632655021, 100, 0}}
I tried to use FindFit again:
FindFit[ComplexData, ComplexModel, {ns∞, m,
A, ΔE}, {i, ns, T}]
however I am still getting an error code:
FindFit::nrlnum: The function value {0.,-69.0731+0.0051321 Re[85. (8.314 +Times
[<<2>>])+1. λp[85.]],<<45>>,0. +0.0228971 (831.4 Im[Log[Times[<<2>>]]]+1. Im
[λp[100.]]),0. +0.0246735 (831.4 Im[Log[Times[<<2>>]]]+1. Im[λp
[100.]])} is not a list of real numbers with dimensions {49} at {ns∞,m,A,
ΔE} = {1.,1.,1.,1.}. >>
Any help would be greatly appreciated.
ComplexFit[Data, qobs, {ns∞, m, A, ΔE}, {ns, T}, "CoordinateSystem" -> "Real"]
will do what you want. Of course, @m_goldberg's answer is absolutely correct. $\endgroup$