Help to Build Proper Expression for Complicated FuncFit Case
jjweimer
I have a sequence of functions F1, F2 ... FN that are summed to give a total function FT. Each function Fj can have different types (e.g. a full form or an approximation). Each form of each function has its own input parameters pjk. I have a control panel designed to allow a user to select what functions to sum (i.e. in some cases Fj = 0), what form of a function to use when it is to be summed, and what values of parameters to use in the function. IOW, I have a control panel that allows a user to show how various cases appear in a graph depending on expectations (which equation is / is not added to the set), approximations (type of function), and system conditions (input parameters).
I have no problems so far.
I add to this mix the option to generate "noise" on the FT using the gnoise(...) function. The result is a model noisy curve overlaying a theoretical true curve.
I still have no problems to here.
Now, I want to reverse one part of this process. I have one specific input parameter, call it A, that is fundamental to the entire system. I want to fit the model noisy data with the theoretical equations to obtain A ± \Delta A. IOW, I want to find out, for a given set of expectations + approximations + system conditions + noise what we could expect to obtain in the confidence in A.
For those still with me, this is called uncertainty budget analysis. I have a submitted paper on it from the theoretical side. I am now attacking the simulation/modeling side.
At the moment, I have only two Fj functions that are of immediate concern. I am in fact doing the test with only one to obtain the proof of concept. My problem is to determine how I can design a call to the FuncFit operation that will allow me to do what I need immediately (fit any type of F1 pre-selected by the user) and also not lock me out of growing the model to adding other Fj terms.
Here is an example of the function that generates the one Fj function that I have under design ...
//structure for vdWForces
// ww[0] - A
Structure vdWForces
wave ww
variable xx
variable type
variable Rs
variable lambdac
endStructure
// coefficients for vdW forces
// 0 - A; type; Rs; lambdac
Function generate_fcvdW(fs,z)
STRUCT vdWForces &fs
variable z
// local variables
variable rtn
// returns at boundaries
if (z <= 0)
return NaN
endif
fs.xx = z
// calculate
switch(fs.type)
case 0: // unretarded short distance
rtn = fvdWua(fs)
break
case 1: // unretarded full
rtn = fvdWuf(fs)
break
case 2: // retarded
rtn = fvdWrs(fs)
break
endswitch
return rtn
end
// ww[0] - A
Structure vdWForces
wave ww
variable xx
variable type
variable Rs
variable lambdac
endStructure
// coefficients for vdW forces
// 0 - A; type; Rs; lambdac
Function generate_fcvdW(fs,z)
STRUCT vdWForces &fs
variable z
// local variables
variable rtn
// returns at boundaries
if (z <= 0)
return NaN
endif
fs.xx = z
// calculate
switch(fs.type)
case 0: // unretarded short distance
rtn = fvdWua(fs)
break
case 1: // unretarded full
rtn = fvdWuf(fs)
break
case 2: // retarded
rtn = fvdWrs(fs)
break
endswitch
return rtn
end
I am hoping to use two parts of FuncFit. First, I hope to use the string expression form to sum functions
FuncFit {string=...} ...
. Secondly, I am hoping to stay with structure functions. But ... now the problem. First, I see that string expressions may only work with coefficient waves, not structure functions. OK, I tried that. My problem is, when I feed four parameters to the coefficient wave and only want ONE of them to vary (so I set holdstring = "1011"), I get singular matrix issues (e.g. no dependence on coef[0] or coef[3]).Where should I go next? I am stubbornly reluctant to think that I should hard code this and then have to rebuild the hard code for each new case in the future. But, perhaps that is the best option here???
For those so interested, this is a van der Waals force term expression between two macroscopic bodies. Eventually this will end up with repulsive, capacitance, double-layer, and viscous fluid forces. It is heading toward models of data from force-distance curves obtained in atomic force microscopy or the surface force apparatus. Contact me off-line when you might have some interest in the details.
Recommendations would be appreciated.
TIA!
July 22, 2017 at 06:06 am - Permalink
It was probably the Friday-night sangria yesterday that helped me resolve my initial stubbornness. :-)
--
J. J. Weimer
Chemistry / Chemical & Materials Engineering, UAH
July 22, 2017 at 11:50 am - Permalink
John Weeks
WaveMetrics, Inc.
support@wavemetrics.com
July 24, 2017 at 09:10 am - Permalink
My test was with just one function in the
string={...}
call. Everything worked EXCEPT that I got singular matrix issues. By the time I was done thinking about the problem in greater breadth, I realized that I only have one parameter that I need as a coefficient. It really makes no sense to do anything other than a hard-coded fitting function that uses a coeff wave rather than a structure fit function. The one downside is, I have to pass fixed parameters in to the function. The hard parameters pjk are pulled from the panel input. I know how to pass the parameters as globals or through a structure initialization routine. The few upsides are that I am able to put the core functions Fj in to structure format (i.e. as FuncFit functions) and "hide" them in independent modules as static. I have a top-level function (non-static) that is the entry point to the independent module. That top-level function has takes the callimname#forceeqn(ww,xx)
. The coeff wave ww has only one parameter (the A parameter that I am reverse analyzing).It all works rather nicely now!
--
J. J. Weimer
Chemistry / Chemical & Materials Engineering, UAH
July 24, 2017 at 05:15 pm - Permalink