gphys 1.5.0 → 1.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. checksums.yaml +7 -0
  2. data/ChangeLog +7414 -0
  3. data/LICENSE.txt +1 -1
  4. data/Rakefile +0 -2
  5. data/doc/derivative/math-doc/document/images.log +385 -0
  6. data/doc/ep_flux/math-doc/document/images.log +1375 -0
  7. data/doc/ganalysis/doc/NumRu.html +203 -0
  8. data/doc/ganalysis/doc/NumRu/GAnalysis.html +931 -0
  9. data/doc/ganalysis/doc/NumRu/GAnalysis/BetaPlane.html +574 -0
  10. data/doc/ganalysis/doc/NumRu/GAnalysis/Fitting.html +576 -0
  11. data/doc/ganalysis/doc/NumRu/GAnalysis/LogP.html +425 -0
  12. data/doc/ganalysis/doc/NumRu/GAnalysis/Met.html +2021 -0
  13. data/doc/ganalysis/doc/NumRu/GAnalysis/MetZ.html +524 -0
  14. data/doc/ganalysis/doc/NumRu/GAnalysis/Planet.html +1047 -0
  15. data/doc/ganalysis/doc/NumRu/GAnalysis/QG.html +794 -0
  16. data/doc/ganalysis/doc/NumRu/GAnalysis/QG/Uninitialized.html +215 -0
  17. data/doc/ganalysis/doc/NumRu/GAnalysis/QG_common.html +603 -0
  18. data/doc/ganalysis/doc/NumRu/GAnalysis/QG_sphere.html +760 -0
  19. data/doc/ganalysis/doc/NumRu/GAnalysis/QG_sphere_common.html +251 -0
  20. data/doc/ganalysis/doc/NumRu/GAnalysis/QG_sphere_div.html +424 -0
  21. data/doc/ganalysis/doc/NumRu/GAnalysis/SigmaCoord.html +321 -0
  22. data/doc/ganalysis/doc/NumRu/GGraph.html +334 -0
  23. data/doc/ganalysis/doc/NumRu/GPhys.html +579 -0
  24. data/doc/ganalysis/doc/Object.html +210 -0
  25. data/doc/ganalysis/doc/__/__/lib/numru/ganalysis/beta_plane_rb.html +60 -0
  26. data/doc/ganalysis/doc/__/__/lib/numru/ganalysis/covariance_rb.html +56 -0
  27. data/doc/ganalysis/doc/__/__/lib/numru/ganalysis/eof_rb.html +64 -0
  28. data/doc/ganalysis/doc/__/__/lib/numru/ganalysis/fitting_rb.html +54 -0
  29. data/doc/ganalysis/doc/__/__/lib/numru/ganalysis/histogram_rb.html +58 -0
  30. data/doc/ganalysis/doc/__/__/lib/numru/ganalysis/log_p_rb.html +60 -0
  31. data/doc/ganalysis/doc/__/__/lib/numru/ganalysis/met_rb.html +60 -0
  32. data/doc/ganalysis/doc/__/__/lib/numru/ganalysis/met_z_rb.html +58 -0
  33. data/doc/ganalysis/doc/__/__/lib/numru/ganalysis/planet_rb.html +58 -0
  34. data/doc/ganalysis/doc/__/__/lib/numru/ganalysis/qg_rb.html +64 -0
  35. data/doc/ganalysis/doc/__/__/lib/numru/ganalysis/sigma_coord_rb.html +56 -0
  36. data/doc/ganalysis/doc/__/__/lib/numru/ganalysis_rb.html +98 -0
  37. data/doc/ganalysis/doc/created.rid +13 -0
  38. data/doc/ganalysis/doc/images/brick.png +0 -0
  39. data/doc/ganalysis/doc/images/brick_link.png +0 -0
  40. data/doc/ganalysis/doc/images/bug.png +0 -0
  41. data/doc/ganalysis/doc/images/bullet_black.png +0 -0
  42. data/doc/ganalysis/doc/images/bullet_toggle_minus.png +0 -0
  43. data/doc/ganalysis/doc/images/bullet_toggle_plus.png +0 -0
  44. data/doc/ganalysis/doc/images/date.png +0 -0
  45. data/doc/ganalysis/doc/images/find.png +0 -0
  46. data/doc/ganalysis/doc/images/loadingAnimation.gif +0 -0
  47. data/doc/ganalysis/doc/images/macFFBgHack.png +0 -0
  48. data/doc/ganalysis/doc/images/package.png +0 -0
  49. data/doc/ganalysis/doc/images/page_green.png +0 -0
  50. data/doc/ganalysis/doc/images/page_white_text.png +0 -0
  51. data/doc/ganalysis/doc/images/page_white_width.png +0 -0
  52. data/doc/ganalysis/doc/images/plugin.png +0 -0
  53. data/doc/ganalysis/doc/images/ruby.png +0 -0
  54. data/doc/ganalysis/doc/images/tag_green.png +0 -0
  55. data/doc/ganalysis/doc/images/wrench.png +0 -0
  56. data/doc/ganalysis/doc/images/wrench_orange.png +0 -0
  57. data/doc/ganalysis/doc/images/zoom.png +0 -0
  58. data/doc/ganalysis/doc/index.html +383 -0
  59. data/doc/ganalysis/doc/js/darkfish.js +118 -0
  60. data/doc/ganalysis/doc/js/jquery.js +32 -0
  61. data/doc/ganalysis/doc/js/quicksearch.js +114 -0
  62. data/doc/ganalysis/doc/js/thickbox-compressed.js +10 -0
  63. data/doc/ganalysis/doc/rdoc.css +763 -0
  64. data/ext/numru/gphys/ext_init.c +1 -0
  65. data/ext/numru/gphys/quad_mesh_sample.c +478 -0
  66. data/gphys.gemspec +2 -2
  67. data/lib/numru/dclext.rb +394 -14
  68. data/lib/numru/derivative.rb +6 -0
  69. data/lib/numru/ganalysis/qg.rb +6 -4
  70. data/lib/numru/ggraph.rb +41 -8
  71. data/lib/numru/gphys/gphys.rb +62 -14
  72. data/lib/numru/gphys/gphys_io.rb +4 -4
  73. data/lib/numru/gphys/version.rb +2 -2
  74. metadata +84 -79
  75. data/.gitignore +0 -14
  76. data/TODO_ep_flux +0 -6
  77. data/gphys-bigmem.gemspec +0 -44
  78. data/install.rb +0 -130
  79. data/sample/cira86_to_nc.rb +0 -122
  80. data/sample/druby_cli1.rb +0 -23
  81. data/sample/druby_cli2.rb +0 -28
  82. data/sample/druby_serv1.rb +0 -30
  83. data/sample/druby_serv2.rb +0 -51
  84. data/sample/ep_flux/demo_NCEP_1.rb +0 -48
  85. data/sample/ep_flux/demo_NCEP_2.rb +0 -57
  86. data/sample/ep_flux/demo_NCEP_3.rb +0 -81
  87. data/sample/ggraph_latlon_labelling_dr002690.rb +0 -159
  88. data/sample/ggraph_mapfit-axes_dr002687.rb +0 -131
  89. data/sample/map_projection.rb +0 -121
  90. data/sample/ncep_theta_coord.rb +0 -79
  91. data/test_old/eof_slp.rb +0 -28
  92. data/test_old/mltbit.dat +0 -0
  93. data/test_old/test_ep_flux.rb +0 -533
  94. data/test_old/test_multibitIO.rb +0 -19
@@ -0,0 +1,576 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
3
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
4
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5
+ <head>
6
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
7
+
8
+ <title>Module: NumRu::GAnalysis::Fitting</title>
9
+
10
+ <link rel="stylesheet" href="../../rdoc.css" type="text/css" media="screen" />
11
+
12
+ <script src="../../js/jquery.js" type="text/javascript" charset="utf-8"></script>
13
+ <script src="../../js/thickbox-compressed.js" type="text/javascript" charset="utf-8"></script>
14
+ <script src="../../js/quicksearch.js" type="text/javascript" charset="utf-8"></script>
15
+ <script src="../../js/darkfish.js" type="text/javascript" charset="utf-8"></script>
16
+
17
+ </head>
18
+ <body id="top" class="module">
19
+
20
+ <div id="metadata">
21
+ <div id="home-metadata">
22
+ <div id="home-section" class="section">
23
+ <h3 class="section-header">
24
+ <a href="../../index.html">Home</a>
25
+ <a href="../../index.html#classes">Classes</a>
26
+ <a href="../../index.html#methods">Methods</a>
27
+ </h3>
28
+ </div>
29
+ </div>
30
+
31
+ <div id="file-metadata">
32
+ <div id="file-list-section" class="section">
33
+ <h3 class="section-header">In Files</h3>
34
+ <div class="section-body">
35
+ <ul>
36
+
37
+ <li><a href="../../__/__/lib/numru/ganalysis/fitting_rb.html?TB_iframe=true&amp;height=550&amp;width=785"
38
+ class="thickbox" title="../../lib/numru/ganalysis/fitting.rb">../../lib/numru/ganalysis/fitting.rb</a></li>
39
+
40
+ </ul>
41
+ </div>
42
+ </div>
43
+
44
+
45
+ </div>
46
+
47
+ <div id="class-metadata">
48
+
49
+
50
+
51
+
52
+
53
+
54
+
55
+ <!-- Method Quickref -->
56
+ <div id="method-list-section" class="section">
57
+ <h3 class="section-header">Methods</h3>
58
+ <ul class="link-list">
59
+
60
+ <li><a href="#method-i-least_square_fit">#least_square_fit</a></li>
61
+
62
+ </ul>
63
+ </div>
64
+
65
+
66
+
67
+ </div>
68
+
69
+ <div id="project-metadata">
70
+
71
+
72
+
73
+ <div id="classindex-section" class="section project-section">
74
+ <h3 class="section-header">Class/Module Index
75
+ <span class="search-toggle"><img src="../../images/find.png"
76
+ height="16" width="16" alt="[+]"
77
+ title="show/hide quicksearch" /></span></h3>
78
+ <form action="#" method="get" accept-charset="utf-8" class="initially-hidden">
79
+ <fieldset>
80
+ <legend>Quicksearch</legend>
81
+ <input type="text" name="quicksearch" value=""
82
+ class="quicksearch-field" />
83
+ </fieldset>
84
+ </form>
85
+
86
+ <ul class="link-list">
87
+
88
+ <li><a href="../../NumRu.html">NumRu</a></li>
89
+
90
+ <li><a href="../../NumRu/GAnalysis.html">NumRu::GAnalysis</a></li>
91
+
92
+ <li><a href="../../NumRu/GAnalysis/BetaPlane.html">NumRu::GAnalysis::BetaPlane</a></li>
93
+
94
+ <li><a href="../../NumRu/GAnalysis/Fitting.html">NumRu::GAnalysis::Fitting</a></li>
95
+
96
+ <li><a href="../../NumRu/GAnalysis/LogP.html">NumRu::GAnalysis::LogP</a></li>
97
+
98
+ <li><a href="../../NumRu/GAnalysis/Met.html">NumRu::GAnalysis::Met</a></li>
99
+
100
+ <li><a href="../../NumRu/GAnalysis/MetZ.html">NumRu::GAnalysis::MetZ</a></li>
101
+
102
+ <li><a href="../../NumRu/GAnalysis/Planet.html">NumRu::GAnalysis::Planet</a></li>
103
+
104
+ <li><a href="../../NumRu/GAnalysis/QG.html">NumRu::GAnalysis::QG</a></li>
105
+
106
+ <li><a href="../../NumRu/GAnalysis/QG/Uninitialized.html">NumRu::GAnalysis::QG::Uninitialized</a></li>
107
+
108
+ <li><a href="../../NumRu/GAnalysis/QG_common.html">NumRu::GAnalysis::QG_common</a></li>
109
+
110
+ <li><a href="../../NumRu/GAnalysis/QG_sphere.html">NumRu::GAnalysis::QG_sphere</a></li>
111
+
112
+ <li><a href="../../NumRu/GAnalysis/QG_sphere_common.html">NumRu::GAnalysis::QG_sphere_common</a></li>
113
+
114
+ <li><a href="../../NumRu/GAnalysis/QG_sphere_div.html">NumRu::GAnalysis::QG_sphere_div</a></li>
115
+
116
+ <li><a href="../../NumRu/GAnalysis/SigmaCoord.html">NumRu::GAnalysis::SigmaCoord</a></li>
117
+
118
+ <li><a href="../../NumRu/GGraph.html">NumRu::GGraph</a></li>
119
+
120
+ <li><a href="../../NumRu/GPhys.html">NumRu::GPhys</a></li>
121
+
122
+ <li><a href="../../Object.html">Object</a></li>
123
+
124
+ </ul>
125
+ <div id="no-class-search-results" style="display: none;">No matching classes.</div>
126
+ </div>
127
+
128
+
129
+ </div>
130
+ </div>
131
+
132
+ <div id="documentation">
133
+ <h1 class="module">NumRu::GAnalysis::Fitting</h1>
134
+
135
+ <div id="description" class="description">
136
+
137
+ <p>Library for function fitting</p>
138
+
139
+ </div><!-- description -->
140
+
141
+
142
+
143
+
144
+ <div id="5Buntitled-5D" class="documentation-section">
145
+
146
+
147
+
148
+
149
+
150
+ <!-- Constants -->
151
+ <div id="constants-list" class="section">
152
+ <h3 class="section-header">Constants</h3>
153
+ <dl>
154
+
155
+ <dt><a name="X">X</a></dt>
156
+
157
+ <dd class="description"><p>predefined Proc for fitting: Polynomial x (function of the 1st dim)</p></dd>
158
+
159
+
160
+ <dt><a name="XX">XX</a></dt>
161
+
162
+ <dd class="description"><p>predefined Proc for fitting: Polynomial x**2 (function of the 1st dim)</p></dd>
163
+
164
+
165
+ <dt><a name="XY">XY</a></dt>
166
+
167
+ <dd class="description"><p>predefined Proc for fitting: Polynomial x*y (function of the 1st&amp;2nd
168
+ dims)</p></dd>
169
+
170
+
171
+ <dt><a name="Y">Y</a></dt>
172
+
173
+ <dd class="description"><p>predefined Proc for fitting: Polynomial y (function of the 2nd dim)</p></dd>
174
+
175
+
176
+ <dt><a name="YY">YY</a></dt>
177
+
178
+ <dd class="description"><p>predefined Proc for fitting: Polynomial y**2 (function of the 2nd dim)</p></dd>
179
+
180
+
181
+ </dl>
182
+ </div>
183
+
184
+
185
+
186
+
187
+ <!-- Methods -->
188
+
189
+ <div id="public-instance-method-details" class="method-section section">
190
+ <h3 class="section-header">Public Instance Methods</h3>
191
+
192
+
193
+ <div id="least_square_fit-method" class="method-detail ">
194
+ <a name="method-i-least_square_fit"></a>
195
+
196
+
197
+ <div class="method-heading">
198
+ <span class="method-name">least_square_fit</span><span
199
+ class="method-args">(data, grid_locs, functions, ensemble_dims=nil, indep_dims=nil)</span>
200
+ <span class="method-click-advice">click to toggle source</span>
201
+ </div>
202
+
203
+
204
+ <div class="method-description">
205
+
206
+ <p>Least square fit of a linear combination of any functions (basic NArray
207
+ version).</p>
208
+
209
+ <h3>ARGUMENTS</h3>
210
+ <ul><li>
211
+ <p><tt>data</tt> [NArray or NArrayMiss] multi-D data to fit</p>
212
+ </li><li>
213
+ <p><tt>grid_locs</tt> [Array of 1D NArrays] Grid points of independent
214
+ variables (so grid_locs.length == the # of independent variables).</p>
215
+ </li><li>
216
+ <p><tt>functions</tt> [Array of Procs] Proc objects to represent the
217
+ functions, which accept the elements of <tt>grid_locs</tt> as the arguments
218
+ (so the number of arguments fed is equal to the length of
219
+ <tt>grid_locs</tt>).</p>
220
+ </li><li>
221
+ <p><tt>ensemble_dims</tt> (optional) [nil (defualt) or Array of Integers] When
222
+ <tt>grid_locs.length &lt; data.rank</tt>, this argument can be used to
223
+ specify the dimensions that are not included in grid_locs and are used for
224
+ ensemble averaging</p>
225
+ </li><li>
226
+ <p><tt>indep_dims</tt> (optional) [nil (defualt) or Array of Integers] When
227
+ <tt>grid_locs.length &lt; data.rank</tt>, this argument can be used to
228
+ specify the dimensions that are not included in <tt>grid_locs</tt> and are
229
+ treated as independent, so the fitting is made for each of their component.</p>
230
+ </li></ul>
231
+
232
+ <p>Note that the sum of the lengths of <tt>grid_locs</tt>,
233
+ <tt>ensemble_dims</tt> and <tt>indep_dims</tt> must be equal to the rank (#
234
+ of dims) of <tt>data</tt>.</p>
235
+
236
+ <h3>RETURN VALUES</h3>
237
+
238
+ <pre>[ c, bf, diff ]</pre>
239
+
240
+ <p>where</p>
241
+ <ul><li>
242
+ <p><tt>c</tt> is a NArray containing the coefficients of the functions and the
243
+ constant offset; its length is one greater than the number of
244
+ <tt>functions</tt> because of the offset. It is 1D unless the
245
+ <tt>indep_dims</tt> argument is used (see the examples below).</p>
246
+ </li><li>
247
+ <p><tt>bf</tt> is a NArray having the best fit grid point values. Its rank is
248
+ equal to data.rank, but the lengths along <tt>ensemble_dims</tt> are
249
+ simply 1.</p>
250
+ </li><li>
251
+ <p>rms of the difference between the data and best fit</p>
252
+ </li></ul>
253
+
254
+ <h3>EXAMPLES</h3>
255
+ <ul><li>
256
+ <p>Simple 1D case</p>
257
+
258
+ <p>Line fitting:</p>
259
+
260
+ <pre>nx = 5
261
+ x = NArray.float(nx).indgen! - nx/2
262
+ data = x + x*x*0.1
263
+ c, bf = GAnalysis::Fitting.least_square_fit(data, [x],
264
+ [GAnalysis::Fitting::X])
265
+ p &quot;data:&quot;, data, &quot;c:&quot;, c, &quot;bf:&quot;, bf</pre>
266
+
267
+ <p>Here, +GAnalysis::Fitting::X+ is a predefined Proc to represent the first
268
+ order polynomial x. The data values given as above follow f(x) = x +
269
+ x**2/10. Then the result printed by the last line is</p>
270
+
271
+ <pre>&quot;data:&quot;
272
+ NArray.float(5):
273
+ [ -1.6, -0.9, 0.0, 1.1, 2.4 ]
274
+ &quot;c:&quot;
275
+ NArray.float(2):
276
+ [ 1.0, 0.2 ]
277
+ &quot;bf:&quot;
278
+ NArray.float(5):
279
+ [ -1.8, -0.8, 0.2, 1.2, 2.2 ]</pre>
280
+
281
+ <p>The <tt>c</tt> values indicate that the fitting result is f(x) = 1.0*x +
282
+ 0.2, and the <tt>bf</tt> values are its grid point values.</p>
283
+
284
+ <p>Parabolic fitting:</p>
285
+
286
+ <p>You can also fit the data by 2nd order polynomial as</p>
287
+
288
+ <pre>c, bf = GAnalysis::Fitting.least_square_fit(data, [x],
289
+ [GAnalysis::Fitting::XX,GAnalysis::Fitting::X])</pre>
290
+
291
+ <p>Then the result will be</p>
292
+
293
+ <pre>p c #--&gt; [0.1, 1.0, 0.0]</pre>
294
+
295
+ <p>which indicates the original 2nd order polynomial 0.1 x**2 + x, so it
296
+ follows <tt>data == bf</tt> (except for round-off error if any).</p>
297
+ </li><li>
298
+ <p>1D fitting of multi-D data (ensemble case)</p>
299
+
300
+ <p>Suppose you have a 2D NArray (or NArrayMiss) data, in which the 1st dim
301
+ represents x and the 2nd dim represents something else (such as time
302
+ sequence, or just a simple ensemble). If you want to use the entire data to
303
+ get a single fit, use the <tt>ensemble_dims</tt> argument to specify the
304
+ non-x dimension(s). You can fit the data, for example, by p*sin(x) +
305
+ q*cos(x) + r as follows:</p>
306
+
307
+ <pre>sin = proc{|x| NMath.sin(x)}
308
+ cos = proc{|x| NMath.cos(x)}
309
+ c, bf = GAnalysis::Fitting.least_square_fit(data, [x],
310
+ [sin, cos], [1])</pre>
311
+
312
+ <p>Here, the last parameter [1] is given as the arguemnt
313
+ <tt>ensemble_dims</tt> to express that the dimension 1 (2nd dimension) of
314
+ <tt>data</tt> is the ensemble dimension, so the x coordinate is the
315
+ remaining dimension 0 (1st dimension). The coefficients of the functions
316
+ are returned by the 1st return value as a NArray, so</p>
317
+
318
+ <pre>p = c[0]
319
+ q = c[1]
320
+ r = c[2]</pre>
321
+ </li><li>
322
+ <p>1D fitting of multi-D data (individual fitting)</p>
323
+
324
+ <p>Suppose you have the same data as above, but you want to fit it for each of
325
+ the 2nd dim elements. You can do it as follows:</p>
326
+
327
+ <pre>c, bf = GAnalysis::Fitting.least_square_fit(data, [x],
328
+ [sin, cos], nil, [1])</pre>
329
+
330
+ <p>Here, <tt>nil</tt> is given as the 4th argument (<tt>ensemble_dims</tt>)
331
+ and [1] is given as the fifth (<tt>indep_dims</tt>). In this case, the
332
+ return value <tt>c</tt> is 2-dimensional; the first being the coefficients
333
+ as above and the second representing the non-x (i.e., the second) dim of
334
+ <tt>data</tt>.</p>
335
+ </li><li>
336
+ <p>2D fitting</p>
337
+
338
+ <p>It can be done like</p>
339
+
340
+ <pre>cosx = proc {|x,y| NMath.cos(x).newdim!(-1)}
341
+ sinx = proc {|x,y| NMath.sin(x).newdim!(-1)}
342
+ cosy = proc {|x,y| NMath.cos(y).newdim!(0)}
343
+ siny = proc {|x,y| NMath.sin(y).newdim!(0)}
344
+ c, bf = GAnalysis::Fitting.least_square_fit(data4D, [x,y],
345
+ [cosx, sinx, cosy, siny], [2,3])</pre>
346
+
347
+ <p>where <tt>data4D</tt> is a 4D NArray, whose first and second dimensions
348
+ (dimensions 0 and 1) represent x and y axis, respectively, and the 1D
349
+ NArrays <tt>x</tt> and <tt>y</tt> are the grid points. Note that the
350
+ functions (<tt>cosx</tt> etc) accept 2 arguments (x and y), and they use
351
+ NArray’s <tt>newdim</tt> method to return 2D NArray (newdim!(-1) inserts a
352
+ 1-element dim to the end, and newdim(0) inserts a 1-element dim to the
353
+ beginning).</p>
354
+ </li></ul>
355
+
356
+ <p>TYPICAL ERRORS</p>
357
+ <ul><li>
358
+ <p>Error is raised (from the LU decomposition), if the problem cannot be
359
+ solved. That happens if you specify a same function twice (redundantly) in
360
+ the <tt>functions</tt> argument, as a matter of course.</p>
361
+ </li><li>
362
+ <p>Error is raised if the number of data is insuffcient for the number of
363
+ functions (also unsolvable).</p>
364
+ </li></ul>
365
+
366
+
367
+
368
+ <div class="method-source-code" id="least_square_fit-source">
369
+ <pre>
370
+ <span class="ruby-comment"># File ../../lib/numru/ganalysis/fitting.rb, line 217</span>
371
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">least_square_fit</span>(<span class="ruby-identifier">data</span>, <span class="ruby-identifier">grid_locs</span>, <span class="ruby-identifier">functions</span>, <span class="ruby-identifier">ensemble_dims</span>=<span class="ruby-keyword">nil</span>,
372
+ <span class="ruby-identifier">indep_dims</span>=<span class="ruby-keyword">nil</span>)
373
+
374
+ <span class="ruby-comment">#&lt; argument check &gt;</span>
375
+
376
+ <span class="ruby-identifier">grid_locs</span>.<span class="ruby-identifier">each_with_index</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">x</span>,<span class="ruby-identifier">i</span><span class="ruby-operator">|</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">ensure_1D_NArray</span>(<span class="ruby-identifier">x</span>, <span class="ruby-identifier">i</span>)}
377
+ <span class="ruby-identifier">functions</span>.<span class="ruby-identifier">each</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">f</span><span class="ruby-operator">|</span> <span class="ruby-identifier">raise</span>(<span class="ruby-string">&quot;Found non-Proc arg&quot;</span>) <span class="ruby-keyword">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">f</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">Proc</span>)}
378
+
379
+ <span class="ruby-identifier">functions</span> = <span class="ruby-identifier">functions</span> <span class="ruby-operator">+</span> [<span class="ruby-identifier">@@unity</span>] <span class="ruby-comment"># constanf offset</span>
380
+
381
+ <span class="ruby-identifier">ng</span> = <span class="ruby-identifier">grid_locs</span>.<span class="ruby-identifier">length</span>
382
+ <span class="ruby-identifier">rank</span> = <span class="ruby-identifier">data</span>.<span class="ruby-identifier">rank</span>
383
+ <span class="ruby-identifier">ensemble_dims</span> = [ <span class="ruby-identifier">ensemble_dims</span> ] <span class="ruby-keyword">if</span> <span class="ruby-identifier">ensemble_dims</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">Integer</span>)
384
+ <span class="ruby-identifier">indep_dims</span> = [ <span class="ruby-identifier">indep_dims</span> ] <span class="ruby-keyword">if</span> <span class="ruby-identifier">indep_dims</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">Integer</span>)
385
+
386
+ <span class="ruby-identifier">ensemble_dims</span> = <span class="ruby-constant">Array</span>.<span class="ruby-identifier">new</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">ensemble_dims</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-comment"># --&gt; always an Array</span>
387
+ <span class="ruby-identifier">n_indep</span> = ( <span class="ruby-identifier">indep_dims</span> <span class="ruby-operator">?</span> <span class="ruby-identifier">indep_dims</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">:</span> <span class="ruby-value">0</span> )
388
+
389
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">ng</span> <span class="ruby-operator">&lt;</span> <span class="ruby-identifier">rank</span>
390
+ <span class="ruby-identifier">ensemble_dims</span> = <span class="ruby-identifier">ensemble_dims</span>.<span class="ruby-identifier">collect</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">d</span><span class="ruby-operator">|</span>
391
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">d</span><span class="ruby-operator">&lt;</span><span class="ruby-operator">-</span><span class="ruby-identifier">rank</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">d</span><span class="ruby-operator">&gt;=</span><span class="ruby-identifier">rank</span>
392
+ <span class="ruby-identifier">raise</span> <span class="ruby-node">&quot;Invalid ensemble_dims value (#{d}) for rank #{rank} NArray&quot;</span>
393
+ <span class="ruby-keyword">end</span>
394
+ <span class="ruby-identifier">d</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">rank</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">d</span><span class="ruby-operator">&lt;</span><span class="ruby-value">0</span>
395
+ <span class="ruby-identifier">d</span>
396
+ }
397
+ <span class="ruby-identifier">ensemble_dims</span>.<span class="ruby-identifier">sort!</span>
398
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">indep_dims</span>
399
+ <span class="ruby-identifier">indep_dims</span> = <span class="ruby-identifier">indep_dims</span>.<span class="ruby-identifier">collect</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">d</span><span class="ruby-operator">|</span>
400
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">d</span><span class="ruby-operator">&lt;</span><span class="ruby-operator">-</span><span class="ruby-identifier">rank</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">d</span><span class="ruby-operator">&gt;=</span><span class="ruby-identifier">rank</span>
401
+ <span class="ruby-identifier">raise</span> <span class="ruby-node">&quot;Invalid indep_dims value (#{d}) for rank #{rank} NArray&quot;</span>
402
+ <span class="ruby-keyword">end</span>
403
+ <span class="ruby-identifier">d</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">rank</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">d</span><span class="ruby-operator">&lt;</span><span class="ruby-value">0</span>
404
+ <span class="ruby-identifier">d</span>
405
+ }
406
+ <span class="ruby-identifier">indep_dims</span>.<span class="ruby-identifier">sort!</span>
407
+ <span class="ruby-keyword">end</span>
408
+ <span class="ruby-keyword">elsif</span> <span class="ruby-identifier">ng</span> <span class="ruby-operator">&gt;</span> <span class="ruby-identifier">rank</span>
409
+ <span class="ruby-identifier">raise</span> <span class="ruby-node">&quot;# of grid_locs (#{ng}) &gt; data.rank (#{rank})&quot;</span>
410
+ <span class="ruby-keyword">end</span>
411
+
412
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">data</span>.<span class="ruby-identifier">rank</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">ng</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">ensemble_dims</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">n_indep</span>
413
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">ArgumentError</span>,
414
+ <span class="ruby-string">&quot;lengths of grid_locs, ensemble_dims and indep_dims != data.rank&quot;</span>
415
+ <span class="ruby-keyword">end</span>
416
+
417
+ <span class="ruby-identifier">otherdims</span> = <span class="ruby-identifier">ensemble_dims</span>
418
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">indep_dims</span>
419
+ <span class="ruby-identifier">otherdims</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">indep_dims</span>
420
+ <span class="ruby-identifier">otherdims</span>.<span class="ruby-identifier">sort!</span>.<span class="ruby-identifier">uniq!</span>
421
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">otherdims</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">ensemble_dims</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">n_indep</span>
422
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">ArgumentError</span>, <span class="ruby-string">&quot;Overlap in ensemble_dims and indep_dims&quot;</span>
423
+ <span class="ruby-keyword">end</span>
424
+ <span class="ruby-keyword">end</span>
425
+
426
+ <span class="ruby-comment">#&lt; pre-process data &gt;</span>
427
+
428
+ <span class="ruby-identifier">d0</span> = <span class="ruby-identifier">data</span>.<span class="ruby-identifier">mean</span>
429
+ <span class="ruby-identifier">data</span> = <span class="ruby-identifier">data</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">d0</span> <span class="ruby-comment"># constant offset for numerical stability</span>
430
+
431
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">data</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">NArrayMiss</span>)
432
+ <span class="ruby-identifier">mask</span> = <span class="ruby-identifier">data</span>.<span class="ruby-identifier">get_mask</span>
433
+ <span class="ruby-keyword">elsif</span> <span class="ruby-identifier">data</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">NArray</span>)
434
+ <span class="ruby-identifier">mask</span> = <span class="ruby-keyword">nil</span> <span class="ruby-comment"># NArray.byte(*data.shape).fill!(1)</span>
435
+ <span class="ruby-keyword">else</span>
436
+ <span class="ruby-identifier">raise</span> <span class="ruby-node">&quot;Data type (#{data.class}) is not NArray or NArrayMiss&quot;</span>
437
+ <span class="ruby-keyword">end</span>
438
+
439
+ <span class="ruby-comment">#&lt; derive the matrix &gt;</span>
440
+
441
+ <span class="ruby-identifier">fv</span> = <span class="ruby-identifier">functions</span>.<span class="ruby-identifier">collect</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">f</span><span class="ruby-operator">|</span>
442
+ <span class="ruby-identifier">f</span> = <span class="ruby-identifier">f</span>[*<span class="ruby-identifier">grid_locs</span>]
443
+ <span class="ruby-identifier">otherdims</span>.<span class="ruby-identifier">each</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">d</span><span class="ruby-operator">|</span> <span class="ruby-identifier">f</span>.<span class="ruby-identifier">newdim!</span>(<span class="ruby-identifier">d</span>)}
444
+ <span class="ruby-identifier">f</span>
445
+ }
446
+
447
+ <span class="ruby-identifier">ms</span> = <span class="ruby-identifier">fv</span>.<span class="ruby-identifier">length</span> <span class="ruby-comment"># matrix size</span>
448
+
449
+ <span class="ruby-keyword">if</span> ( (<span class="ruby-identifier">len</span>=<span class="ruby-identifier">data</span>.<span class="ruby-identifier">length</span>) <span class="ruby-operator">&lt;</span> <span class="ruby-identifier">ms</span> )
450
+ <span class="ruby-identifier">raise</span> <span class="ruby-node">&quot;Insufficient data length (#{len}) for the # of funcs+1 (#{ms})&quot;</span>
451
+ <span class="ruby-keyword">end</span>
452
+
453
+ <span class="ruby-identifier">mat</span> = <span class="ruby-constant">NMatrix</span>.<span class="ruby-identifier">float</span>(<span class="ruby-identifier">ms</span>,<span class="ruby-identifier">ms</span>) <span class="ruby-comment"># wil be symmetric</span>
454
+
455
+ <span class="ruby-keyword">for</span> <span class="ruby-identifier">i</span> <span class="ruby-keyword">in</span> <span class="ruby-value">0</span><span class="ruby-operator">...</span><span class="ruby-identifier">ms</span>
456
+ <span class="ruby-keyword">for</span> <span class="ruby-identifier">j</span> <span class="ruby-keyword">in</span> <span class="ruby-value">0</span><span class="ruby-operator">..</span><span class="ruby-identifier">i</span>
457
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">mask</span>
458
+ <span class="ruby-identifier">fvij</span> = <span class="ruby-constant">NArrayMiss</span>.<span class="ruby-identifier">to_nam</span>( <span class="ruby-identifier">fv</span>[<span class="ruby-identifier">i</span>] * <span class="ruby-identifier">fv</span>[<span class="ruby-identifier">j</span>] * <span class="ruby-identifier">mask</span>, <span class="ruby-identifier">mask</span> )
459
+ <span class="ruby-identifier">mat</span>[<span class="ruby-identifier">i</span>,<span class="ruby-identifier">j</span>] = (<span class="ruby-identifier">fvij</span>).<span class="ruby-identifier">mean</span>
460
+ <span class="ruby-keyword">else</span>
461
+ <span class="ruby-identifier">mat</span>[<span class="ruby-identifier">i</span>,<span class="ruby-identifier">j</span>] = (<span class="ruby-identifier">fv</span>[<span class="ruby-identifier">i</span>] * <span class="ruby-identifier">fv</span>[<span class="ruby-identifier">j</span>]).<span class="ruby-identifier">mean</span>
462
+ <span class="ruby-keyword">end</span>
463
+ <span class="ruby-keyword">end</span>
464
+ <span class="ruby-keyword">end</span>
465
+
466
+ <span class="ruby-keyword">for</span> <span class="ruby-identifier">i</span> <span class="ruby-keyword">in</span> <span class="ruby-value">0</span><span class="ruby-operator">...</span><span class="ruby-identifier">ms</span>
467
+ <span class="ruby-keyword">for</span> <span class="ruby-identifier">j</span> <span class="ruby-keyword">in</span> <span class="ruby-identifier">i</span><span class="ruby-operator">+</span><span class="ruby-value">1</span><span class="ruby-operator">...</span><span class="ruby-identifier">ms</span>
468
+ <span class="ruby-identifier">mat</span>[<span class="ruby-identifier">i</span>,<span class="ruby-identifier">j</span>] = <span class="ruby-identifier">mat</span>[<span class="ruby-identifier">j</span>,<span class="ruby-identifier">i</span>] <span class="ruby-comment"># symmetric</span>
469
+ <span class="ruby-keyword">end</span>
470
+ <span class="ruby-keyword">end</span>
471
+ <span class="ruby-comment">#p &quot;*** mat ***&quot;,mat</span>
472
+ <span class="ruby-identifier">lu</span> = <span class="ruby-identifier">mat</span>.<span class="ruby-identifier">lu</span>
473
+
474
+ <span class="ruby-comment">#&lt; derive the vector, solve, and best fit &gt;</span>
475
+
476
+ <span class="ruby-keyword">unless</span> <span class="ruby-identifier">indep_dims</span> <span class="ruby-comment"># fitting only once</span>
477
+ <span class="ruby-comment"># derive the vector</span>
478
+ <span class="ruby-identifier">b</span> = <span class="ruby-constant">NVector</span>.<span class="ruby-identifier">float</span>(<span class="ruby-identifier">ms</span>)
479
+ <span class="ruby-keyword">for</span> <span class="ruby-identifier">i</span> <span class="ruby-keyword">in</span> <span class="ruby-value">0</span><span class="ruby-operator">...</span><span class="ruby-identifier">ms</span>
480
+ <span class="ruby-identifier">b</span>[<span class="ruby-identifier">i</span>] = (<span class="ruby-identifier">data</span> * <span class="ruby-identifier">fv</span>[<span class="ruby-identifier">i</span>]).<span class="ruby-identifier">mean</span>
481
+ <span class="ruby-keyword">end</span>
482
+
483
+ <span class="ruby-comment"># solve</span>
484
+ <span class="ruby-identifier">c</span> = <span class="ruby-identifier">lu</span>.<span class="ruby-identifier">solve</span>(<span class="ruby-identifier">b</span>)
485
+ <span class="ruby-identifier">c</span>[<span class="ruby-value">-1</span>] <span class="ruby-operator">+=</span> <span class="ruby-identifier">d0</span> <span class="ruby-comment"># add the mean subtracted</span>
486
+
487
+ <span class="ruby-comment"># convert c from NVector to NArray (just for cleanliness)</span>
488
+ <span class="ruby-identifier">na</span> = <span class="ruby-constant">NArray</span>.<span class="ruby-identifier">float</span>(<span class="ruby-identifier">ms</span>)
489
+ <span class="ruby-identifier">na</span>[<span class="ruby-keyword">true</span>] = <span class="ruby-identifier">c</span>[<span class="ruby-keyword">true</span>]
490
+ <span class="ruby-identifier">c</span> = <span class="ruby-identifier">na</span>
491
+
492
+ <span class="ruby-comment"># best fit</span>
493
+ <span class="ruby-identifier">bf</span> = <span class="ruby-identifier">c</span>[<span class="ruby-value">-1</span>] <span class="ruby-comment"># the constant offset</span>
494
+ <span class="ruby-keyword">for</span> <span class="ruby-identifier">i</span> <span class="ruby-keyword">in</span> <span class="ruby-value">0</span><span class="ruby-operator">...</span><span class="ruby-identifier">ms</span><span class="ruby-operator">-</span><span class="ruby-value">1</span>
495
+ <span class="ruby-identifier">bf</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">c</span>[<span class="ruby-identifier">i</span>]*<span class="ruby-identifier">fv</span>[<span class="ruby-identifier">i</span>]
496
+ <span class="ruby-keyword">end</span>
497
+
498
+ <span class="ruby-keyword">else</span> <span class="ruby-comment"># fitting multiple times</span>
499
+
500
+ <span class="ruby-comment"># derive vectors</span>
501
+ <span class="ruby-identifier">idshp</span> = <span class="ruby-identifier">indep_dims</span>.<span class="ruby-identifier">collect</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">d</span><span class="ruby-operator">|</span> <span class="ruby-identifier">data</span>.<span class="ruby-identifier">shape</span>[<span class="ruby-identifier">d</span>]}
502
+ <span class="ruby-identifier">bs</span> = <span class="ruby-constant">NArray</span>.<span class="ruby-identifier">float</span>(<span class="ruby-identifier">ms</span>,*<span class="ruby-identifier">idshp</span>)
503
+ <span class="ruby-identifier">meandims</span> = (<span class="ruby-value">0</span><span class="ruby-operator">...</span><span class="ruby-identifier">rank</span>).<span class="ruby-identifier">collect</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">d</span><span class="ruby-operator">|</span> <span class="ruby-identifier">d</span>} <span class="ruby-operator">-</span> <span class="ruby-identifier">indep_dims</span>
504
+ <span class="ruby-keyword">for</span> <span class="ruby-identifier">i</span> <span class="ruby-keyword">in</span> <span class="ruby-value">0</span><span class="ruby-operator">...</span><span class="ruby-identifier">ms</span>
505
+ <span class="ruby-identifier">bsi</span> = (<span class="ruby-identifier">data</span> * <span class="ruby-identifier">fv</span>[<span class="ruby-identifier">i</span>]).<span class="ruby-identifier">mean</span>(*<span class="ruby-identifier">meandims</span>)
506
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">bsi</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">NArrayMiss</span>)
507
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">bsi</span>.<span class="ruby-identifier">count_invalid</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span>
508
+ <span class="ruby-identifier">raise</span>(<span class="ruby-string">&quot;Found invalid data everywhere along indep_dims. Trim data in advance and try again.&quot;</span>)
509
+ <span class="ruby-keyword">end</span>
510
+ <span class="ruby-identifier">bsi</span> = <span class="ruby-identifier">bsi</span>.<span class="ruby-identifier">to_na</span>
511
+ <span class="ruby-keyword">end</span>
512
+ <span class="ruby-identifier">bs</span>[<span class="ruby-identifier">i</span>,<span class="ruby-keyword">false</span>] = <span class="ruby-identifier">bsi</span>
513
+ <span class="ruby-keyword">end</span>
514
+ <span class="ruby-identifier">idlen</span> = <span class="ruby-value">1</span>
515
+ <span class="ruby-identifier">idshp</span>.<span class="ruby-identifier">each</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">l</span><span class="ruby-operator">|</span> <span class="ruby-identifier">idlen</span> <span class="ruby-operator">*=</span> <span class="ruby-identifier">l</span>}
516
+
517
+ <span class="ruby-comment"># solve</span>
518
+ <span class="ruby-identifier">bs</span> = <span class="ruby-identifier">bs</span>.<span class="ruby-identifier">reshape</span>(<span class="ruby-identifier">ms</span>, <span class="ruby-identifier">idlen</span>)
519
+ <span class="ruby-identifier">c</span> = <span class="ruby-constant">NArray</span>.<span class="ruby-identifier">float</span>(<span class="ruby-identifier">ms</span>,<span class="ruby-identifier">idlen</span>)
520
+ <span class="ruby-identifier">b</span> = <span class="ruby-constant">NVector</span>.<span class="ruby-identifier">float</span>(<span class="ruby-identifier">ms</span>)
521
+ <span class="ruby-keyword">for</span> <span class="ruby-identifier">id</span> <span class="ruby-keyword">in</span> <span class="ruby-value">0</span><span class="ruby-operator">...</span><span class="ruby-identifier">idlen</span>
522
+ <span class="ruby-identifier">b</span>[<span class="ruby-keyword">true</span>] = <span class="ruby-identifier">bs</span>[<span class="ruby-keyword">true</span>,<span class="ruby-identifier">id</span>]
523
+ <span class="ruby-identifier">c</span>[<span class="ruby-keyword">true</span>,<span class="ruby-identifier">id</span>] = <span class="ruby-identifier">lu</span>.<span class="ruby-identifier">solve</span>(<span class="ruby-identifier">b</span>)
524
+ <span class="ruby-keyword">end</span>
525
+ <span class="ruby-identifier">c</span>[<span class="ruby-value">-1</span>,<span class="ruby-keyword">true</span>] <span class="ruby-operator">+=</span> <span class="ruby-identifier">d0</span>
526
+ <span class="ruby-identifier">c</span> = <span class="ruby-identifier">c</span>.<span class="ruby-identifier">reshape</span>(<span class="ruby-identifier">ms</span>, *<span class="ruby-identifier">idshp</span>)
527
+
528
+ <span class="ruby-comment"># best fit</span>
529
+ <span class="ruby-identifier">idshp_full</span> = <span class="ruby-constant">Array</span>.<span class="ruby-identifier">new</span>
530
+ <span class="ruby-keyword">for</span> <span class="ruby-identifier">d</span> <span class="ruby-keyword">in</span> <span class="ruby-value">0</span><span class="ruby-operator">...</span><span class="ruby-identifier">rank</span>
531
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">indep_dims</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">d</span>)
532
+ <span class="ruby-identifier">idshp_full</span>[<span class="ruby-identifier">d</span>] = <span class="ruby-identifier">data</span>.<span class="ruby-identifier">shape</span>[<span class="ruby-identifier">d</span>]
533
+ <span class="ruby-keyword">else</span>
534
+ <span class="ruby-identifier">idshp_full</span>[<span class="ruby-identifier">d</span>] = <span class="ruby-value">1</span>
535
+ <span class="ruby-keyword">end</span>
536
+ <span class="ruby-keyword">end</span>
537
+ <span class="ruby-identifier">cs</span> = <span class="ruby-identifier">c</span>.<span class="ruby-identifier">reshape</span>(<span class="ruby-identifier">ms</span>, *<span class="ruby-identifier">idshp_full</span>)
538
+ <span class="ruby-identifier">bf</span> = <span class="ruby-identifier">cs</span>[<span class="ruby-value">-1</span>,<span class="ruby-keyword">false</span>]
539
+ <span class="ruby-keyword">for</span> <span class="ruby-identifier">i</span> <span class="ruby-keyword">in</span> <span class="ruby-value">0</span><span class="ruby-operator">...</span><span class="ruby-identifier">ms</span><span class="ruby-operator">-</span><span class="ruby-value">1</span>
540
+ <span class="ruby-identifier">bf</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">cs</span>[<span class="ruby-identifier">i</span>,<span class="ruby-keyword">false</span>]*<span class="ruby-identifier">fv</span>[<span class="ruby-identifier">i</span>]
541
+ <span class="ruby-keyword">end</span>
542
+
543
+ <span class="ruby-keyword">end</span>
544
+
545
+ <span class="ruby-identifier">diff</span> = <span class="ruby-constant">Math</span>.<span class="ruby-identifier">sqrt</span>( ( (<span class="ruby-identifier">data</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">d0</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">bf</span>)<span class="ruby-operator">**</span><span class="ruby-value">2</span> ).<span class="ruby-identifier">mean</span> )
546
+
547
+ <span class="ruby-comment">#&lt; return &gt;</span>
548
+
549
+ [ <span class="ruby-identifier">c</span>, <span class="ruby-identifier">bf</span>, <span class="ruby-identifier">diff</span> ]
550
+ <span class="ruby-keyword">end</span></pre>
551
+ </div><!-- least_square_fit-source -->
552
+
553
+ </div>
554
+
555
+
556
+
557
+
558
+ </div><!-- least_square_fit-method -->
559
+
560
+
561
+ </div><!-- public-instance-method-details -->
562
+
563
+ </div><!-- 5Buntitled-5D -->
564
+
565
+
566
+ </div><!-- documentation -->
567
+
568
+ <div id="validator-badges">
569
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
570
+ <p><small>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish
571
+ Rdoc Generator</a> 2</small>.</p>
572
+ </div>
573
+
574
+ </body>
575
+ </html>
576
+