IGOR Pro でカーブフィッティング例

#pragma rtGlobals=1 // Use modern global access method.


// インデントが無効になる。。見難いな。


Menu "Macros"
"Plot", mkData("data"); mkGraph("data*")
"Curve Fitting",FitExpToListOfWaves(WaveList("data*", ";", "") )
"Clear", KillWindow Graph0; KillWaves/A/Z
End Menu


Function mkData(prefix)

String prefix
Variable i, imax=3
For (i=1; i<=imax; i=i+1)
Make/o/n=50 $prefix+num2str(i)=sin(x/10*i)
EndFor

End Function


Function mkGraph(str)

String str
String wvlist1,wvlist2
String rgbs,cmd
Variable i=0

Make/O/W/U/N=(3,14) myColors = 0 // make color wave
myColors[0][0] = {65535,16385,16385}
myColors[0][1] = {65535,32764,16385}
myColors[0][2] = {65535,49157,16385}
myColors[0][3] = {65535,65532,16385}
myColors[0][4] = {40969,65535,16385}
myColors[0][5] = {16386,65535,16385}
myColors[0][6] = {16385,65535,41303}
myColors[0][7] = {16385,65535,65535}
myColors[0][8] = {16385,49025,65535}
myColors[0][9] = {16385,28398,65535}
myColors[0][10] = {16385,16388,65535}
myColors[0][11] = {36873,14755,58982}
myColors[0][12] = {65535,16385,55749}
myColors[0][13] = {65535,16385,36045}
MatrixTranspose myColors

wvlist1=WaveList(str, ",", "")
//wvlist1=TraceNameList(str,",",1) // str is WindowName.

If( cmpstr(wvlist1,"")!=0 )
Display
wvlist2=StringFromList(i,wvlist1,",")
Do
AppendToGraph $wvlist2
Sprintf rgbs "%d,%d,%d", myColors[i][0], myColors[i][1], myColors[i][2]
Sprintf cmd, "ModifyGraph rgb(%s)=(%s)"wvlist2,rgbs
Execute cmd
i+=1
wvlist2=StringFromList(i,wvlist1,",")
While( cmpstr(wvlist2,"")!=0 )
Endif

End Function


Function FitExpToListOfWaves(theList)
String theList
Variable i=0
string aWaveName = ""
Variable V_fitOptions = 4 // suppress progress window
Variable V_FitError = 0 // prevent abort on error
do
aWaveName = StringFromList(i, theList)
Wave/Z aWave = $aWaveName
if (!WaveExists(aWave))
break
endif
// /N suppresses screen updates during fitting
// /Q suppresses history output during fitting
CurveFit/N/Q sin aWave /D/R
Wave W_coef
// save the coefficients
Duplicate/O W_coef $("cf_"+aWaveName)
// save errors
Duplicate/O W_sigma, $("sig_"+aWaveName)
if (V_FitError != 0)
// Mark the results as being bad
Wave w = $("cf_"+aWaveName)
w = NaN
Wave w = $("sig_"+aWaveName)
w = NaN
Wave w = $("fit_"+aWaveName)
w = NaN
Wave w = $("Res_"+aWaveName)
w = NaN
V_FitError = 0
endif
i += 1
while(1)
End