File: fitmulti.dem

package info (click to toggle)
gnuplot 6.0.2%2Bdfsg1-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 14,940 kB
  • sloc: ansic: 95,319; cpp: 7,590; makefile: 2,470; javascript: 2,328; sh: 1,531; lisp: 664; perl: 304; pascal: 191; tcl: 88; python: 46
file content (188 lines) | stat: -rw-r--r-- 5,682 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
# fitmulti.dem
#
# Use up to 5D fitting to determine coefficients in linear combinations
# of arbitrarily chosen, but linearly independent basis functions.
# The fit should reproduce these coefficients with high precision.
# Hanno Hoffstadt	August 2007
#
# Increase to 6 dimensions to test revised fit code.
# Replace a recursive call statement with a while <expr> { ... } loop.
# Use "set dummy x, y, x2, x3" to specify dummy parameter names used
# by the fit functions.
# Ethan A Merritt	June 2013
#


# the basis functions
f1(x) = sin(x)
f2(x) = exp(-x)
f3(x) = sqrt(x)
f4(x) = cos(x)
f5(x) = x*x
f6(x) = sin(x+3.)/(x+3.)

# the coefficients for linear combinations
k1=   2.5
k2=  -1.8
k3=  70.0
k4=  -3.2
k5=   0.4
k6=  -0.25

# generate data table containing functions f1(x) to f6(x),
# and linear combinations k1*f1(x) to k1*f1(x)+...+k6*f6(x)
# in increments of dx, up to a value xmax
#
set print $fitmulti
#
x=0
dx=0.5
xmax=10
while (x <= xmax) {

    lc1 = k1 * f1(x)
    lc2 = lc1 + k2 * f2(x)
    lc3 = lc2 + k3 * f3(x)
    lc4 = lc3 + k4 * f4(x)
    lc5 = lc4 + k5 * f5(x)
    lc6 = lc5 + k6 * f6(x)

    # columns 1-5,11 contain the "tabulated basis functions"
    # columns 6-10,12 contain linear combinations with given coefficients
    # and increasing number of components

    print f1(x), f2(x), f3(x), f4(x), f5(x), lc1, lc2, lc3, lc4, lc5, f6(x), lc6

    x = x + dx

}  # End of while loop

unset print

# fitting models
m1(f1) = c1*f1
m2(f1,f2) = c1*f1 + c2*f2
m3(f1,f2,f3) = c1*f1 + c2*f2 + c3*f3
m4(f1,f2,f3,f4) = c1*f1 + c2*f2 + c3*f3 + c4*f4
m5(f1,f2,f3,f4,f5) = c1*f1 + c2*f2 + c3*f3 + c4*f4 + c5*f5
m6(f1,f2,f3,f4,f5,f6) = c1*f1 + c2*f2 + c3*f3 + c4*f4 + c5*f5 + c6*f6

array A[6] = [1,1,1,1,1,1]
a6(f1,f2,f3,f4,f5,f6) = A[1]*f1 + A[2]*f2 + A[3]*f3 + A[4]*f4 + A[5]*f5 + A[6]*f6

# 1D fit:
# basis function in column 1,
# combination with one component in column 6
#
# since column 6 contains k1 * f1(x), i.e. k1 times column 1,
# the fit is expected to find c1 == k1.
#
# for all fits, the assumed error is 1, and is given last in the using spec.

c1=1
fit m1(x) $fitmulti u 1:6:(1) via c1
print "---------------------------------------------------------"
print "1D fit: expected ", k1, " c1 = ", c1
print "---------------------------------------------------------"
pause -1 "Hit return to try for a 2D fit"

# 2D fit:
# basis functions in columns 1 and 2,
# combination with two components in column 7
#
# do not forget to reset the c values so that the fit needs to search anew.
# Check the functioning of preset axis range limit on y

c1=1
c2=1
set yrange [0:.99]
fit m2(x,y) $fitmulti u 1:2:7:(1) via c1,c2
print "---------------------------------------------------------"
print "2D fit: expected ", k1, " c1 = ", c1
print "2D fit: expected ", k2, " c2 = ", c2
print "---------------------------------------------------------"
set yrange [*:*]
pause -1 "Hit return to try for a 3D fit"

# 3D fit:
# basis functions in columns 1, 2, 3,
# combination with three components in column 8

c1=1
c2=1
c3=1
set dummy x, y, x2, x3, x4, x5
fit m3(x,y,x2) $fitmulti u 1:2:3:8:(1) via c1,c2,c3
print "---------------------------------------------------------"
print "3D fit: expected ", k1, " c1 = ", c1
print "3D fit: expected ", k2, " c2 = ", c2
print "3D fit: expected ", k3, " c3 = ", c3
print "---------------------------------------------------------"
pause -1 "Hit return to try for a 4D fit"

# 4D fit:
# basis functions in columns 1, 2, 3, 4,
# combination with four components in column 9

c1=1
c2=1
c3=1
c4=1
fit m4(x,y,x2,x3) $fitmulti u 1:2:3:4:9:(1) via c1,c2,c3,c4
print "---------------------------------------------------------"
print "4D fit: expected ", k1, " c1 = ", c1
print "4D fit: expected ", k2, " c2 = ", c2
print "4D fit: expected ", k3, " c3 = ", c3
print "4D fit: expected ", k4, " c4 = ", c4
print "---------------------------------------------------------"
pause -1 "Hit return to try for a 5D fit"

# 5D fit:
# basis functions in columns 1, 2, 3, 4, 5,
# combination with five components in column 10

c1=1
c2=1
c3=1
c4=1
c5=1
fit m5(x,y,x2,x3,x4) $fitmulti u 1:2:3:4:5:10:(1) via c1,c2,c3,c4,c5
print "---------------------------------------------------------"
print "5D fit: expected ", k1, " c1 = ", c1
print "5D fit: expected ", k2, " c2 = ", c2
print "5D fit: expected ", k3, " c3 = ", c3
print "5D fit: expected ", k4, " c4 = ", c4
print "5D fit: expected ", k5, " c5 = ", c5
print "---------------------------------------------------------"
pause -1 "Hit return to try for a 6D fit"

print "This 6D fit will fail in version 4 but version 5 can handle more parameters"
# 6D fit:
# basis functions in columns 1, 2, 3, 4, 5, 11
# combination with five components in column 12
# test inline range spec

c1=1
c2=1
c3=1
c4=1
c5=1
c6=1
fit [][][][][][-0.2:*] m6(x,y,x2,x3,x4,x5) $fitmulti u 1:2:3:4:5:11:12:(1) via c1,c2,c3,c4,c5,c6
print "---------------------------------------------------------"
print "6D fit: expected ", k1, " c1 = ", c1
print "6D fit: expected ", k2, " c2 = ", c2
print "6D fit: expected ", k3, " c3 = ", c3
print "6D fit: expected ", k4, " c4 = ", c4
print "6D fit: expected ", k5, " c5 = ", c5
print "6D fit: expected ", k6, " c6 = ", c6
print "FIT_NDF = ",FIT_NDF," after range filters (expected 14)"
print "---------------------------------------------------------"

pause -1 "Hit return to try fit with array variables"
fit [][][][][][-0.2:*] a6(x,y,x2,x3,x4,x5) $fitmulti u 1:2:3:4:5:11:12:(1) via A[1],A[2],A[3],A[4],A[5],A[6]
print "---------------------------------------------------------"
show var A_
print "Array A after 6D fit: ", A
pause -1 "Hit return to end multidimension fit demo"
reset