root / UFCalibrage.pas @ 3
Historique | Voir | Annoter | Télécharger (14,822 ko)
1 | 3 | avalancogn | unit UFCalibrage;
|
---|---|---|---|
2 | |||
3 | interface
|
||
4 | |||
5 | uses
|
||
6 | Windows, Forms, Classes, Controls, StdCtrls, Buttons, dmath; |
||
7 | |||
8 | type
|
||
9 | TFCalibrage = class(TForm)
|
||
10 | BBOk: TBitBtn; |
||
11 | LTitle: TLabel; |
||
12 | LMethod: TLabel; |
||
13 | LTime: TLabel; |
||
14 | ETime: TEdit; |
||
15 | LPV: TLabel; |
||
16 | LP2: TLabel; |
||
17 | EPVRSD: TEdit; |
||
18 | EP2RSD: TEdit; |
||
19 | EPVR2: TEdit; |
||
20 | LInitial: TLabel; |
||
21 | LFinal: TLabel; |
||
22 | ECoefEntGestInitial: TEdit; |
||
23 | LStDev: TLabel; |
||
24 | LCoefEntGest: TLabel; |
||
25 | LCoefEntLact: TLabel; |
||
26 | LRatioLipProt: TLabel; |
||
27 | LInfo: TLabel; |
||
28 | ECoefEntLactInitial: TEdit; |
||
29 | ERatioLipProtInitial: TEdit; |
||
30 | ECoefEntGestFinal: TEdit; |
||
31 | ECoefEntLactFinal: TEdit; |
||
32 | ERatioLipProtFinal: TEdit; |
||
33 | ECoefEntGestStDev: TEdit; |
||
34 | ECoefEntLactStDev: TEdit; |
||
35 | ERatioLipProtStDev: TEdit; |
||
36 | EMethod: TEdit; |
||
37 | GBParam: TGroupBox; |
||
38 | GBVariables: TGroupBox; |
||
39 | EP2R2: TEdit; |
||
40 | EPVVar: TEdit; |
||
41 | EP2Var: TEdit; |
||
42 | LR2: TLabel; |
||
43 | LRSD: TLabel; |
||
44 | LVar: TLabel; |
||
45 | Lw: TLabel; |
||
46 | EwP2: TEdit; |
||
47 | EwPds: TEdit; |
||
48 | procedure FormCreate(Sender: TObject);
|
||
49 | procedure FormDestroy(Sender: TObject);
|
||
50 | procedure FormShow(Sender: TObject);
|
||
51 | private
|
||
52 | { D?clarations priv?es }
|
||
53 | Pds, P2: TVector; |
||
54 | X, G: TVector; |
||
55 | H_inv: TMatrix; |
||
56 | F_min, Det: Float; |
||
57 | Freq, Start, Stop: Int64; |
||
58 | MPds, MP2: Extended; |
||
59 | public
|
||
60 | { D?clarations publiques }
|
||
61 | end;
|
||
62 | |||
63 | var
|
||
64 | FCalibrage: TFCalibrage; |
||
65 | |||
66 | implementation
|
||
67 | |||
68 | uses
|
||
69 | Graphics, Math, SysUtils, gnugettext, UVariables, UStrings, UFProfilT, |
||
70 | UCalcSimulT; |
||
71 | |||
72 | {$R *.dfm}
|
||
73 | |||
74 | { Calibration }
|
||
75 | |||
76 | const
|
||
77 | NVar = 3;
|
||
78 | NData = NB_CYCLES + NB_CYCLES - 1;
|
||
79 | MaxIter = 100;
|
||
80 | Tol = 1.0E-6;
|
||
81 | |||
82 | var
|
||
83 | wPds, wP2: Extended; |
||
84 | |||
85 | function Func(X: TVector): Float;
|
||
86 | var
|
||
87 | cycle, jour: Integer; |
||
88 | GainProt: double; |
||
89 | PdsSail, P2Sail, PdsMB, P2MB: array[1..NB_CYCLES] of double; |
||
90 | begin
|
||
91 | PProfilT.CoefEntretienGest := X[1];
|
||
92 | PProfilT.CoefEntretienLact := X[2];
|
||
93 | PProfilT.RatioLipProt := X[3];
|
||
94 | // calcul des CoefNR
|
||
95 | for cycle := 1 to NB_CYCLES do |
||
96 | PProfilT.CoefNR[cycle] := 1;
|
||
97 | CalcSimulT(-1, -1, 1, 1, 8, 0, PResSimulT); |
||
98 | GainProt := 0;
|
||
99 | for jour := 1 to PResSimulT.NbJSim do |
||
100 | if PResSimulT.TabResult[3, jour] = 0 |
||
101 | then // Gestation |
||
102 | GainProt := GainProt + PResSimulT.TabResult[63, jour]
|
||
103 | else
|
||
104 | if (PResSimulT.TabResult[3, jour] = 1) and (PResSimulT.TabResult[3, jour - 1] = 0) |
||
105 | then // Mise bas |
||
106 | begin
|
||
107 | cycle := Round(PResSimulT.TabResult[2, jour]);
|
||
108 | with PProfilT.Truies[cycle] do |
||
109 | PProfilT.CoefNR[cycle] := Math.Max((0.178 * (PdsApMB - PdsSail) - 0.333 * (P2MB - P2Sail)) / (GainProt / 1000), 0); |
||
110 | GainProt := 0;
|
||
111 | end;
|
||
112 | // ?valuation du cas
|
||
113 | CalcSimulT(-1, -1, 1, 1, 8, 0, PResSimulT); |
||
114 | FProfilT.PBCoefEntGest.AsFloat := PProfilT.CoefEntretienGest; |
||
115 | FProfilT.PBCoefEntLact.AsFloat := PProfilT.CoefEntretienLact; |
||
116 | FProfilT.PBRatioLipProt.AsFloat := 1 - PProfilT.RatioLipProt;
|
||
117 | FProfilT.AffGraphCal; |
||
118 | if FProfilT.GaugeCalibr.Progress < FProfilT.GaugeCalibr.MaxValue
|
||
119 | then
|
||
120 | FProfilT.GaugeCalibr.AddProgress(1)
|
||
121 | else
|
||
122 | FProfilT.GaugeCalibr.Progress := 1;
|
||
123 | Application.ProcessMessages; |
||
124 | // poids et ?paisseur de lard apr?s gestation (mise bas)
|
||
125 | for jour := 2 to PResSimulT.NbJSim do |
||
126 | if (PResSimulT.TabResult[3, jour] = 1) and (PResSimulT.TabResult[3, jour - 1] = 0) |
||
127 | then
|
||
128 | begin
|
||
129 | cycle := Round(PResSimulT.TabResult[2, jour]);
|
||
130 | PdsMB[cycle] := PResSimulT.TabResult[60, jour - 1] + PResSimulT.TabResult[61, jour]; |
||
131 | P2MB[cycle] := PResSimulT.TabResult[67, jour - 1] + PResSimulT.TabResult[68, jour]; |
||
132 | end ;
|
||
133 | // poids et ?paisseur de lard apr?s lactation (saillie)
|
||
134 | for jour := 2 to PResSimulT.NbJSim do |
||
135 | if (PResSimulT.TabResult[3, jour] = 0) and (PResSimulT.TabResult[3, jour - 1] = 2) |
||
136 | then
|
||
137 | begin
|
||
138 | cycle := Round(PResSimulT.TabResult[2, jour]);
|
||
139 | PdsSail[cycle] := PResSimulT.TabResult[60, jour - 1] + PResSimulT.TabResult[61, jour]; |
||
140 | P2Sail[cycle] := PResSimulT.TabResult[67, jour - 1] + PResSimulT.TabResult[68, jour]; |
||
141 | end;
|
||
142 | // ?cart par rapport aux valeurs du profil
|
||
143 | Result := 0;
|
||
144 | for cycle := 1 to NB_CYCLES do |
||
145 | Result := Result + Power(PdsMB[cycle] - PProfilT.Truies[cycle].PdsApMB, 2) * wPds;
|
||
146 | for cycle := 2 to NB_CYCLES do |
||
147 | Result := Result + Power(PdsSail[cycle] - PProfilT.Truies[cycle].PdsSail, 2) * wPds;
|
||
148 | for cycle := 1 to NB_CYCLES do |
||
149 | Result := Result + Power(P2MB[cycle] - PProfilT.Truies[cycle].P2MB, 2) * wP2;
|
||
150 | for cycle := 2 to NB_CYCLES do |
||
151 | Result := Result + Power(P2Sail[cycle] - PProfilT.Truies[cycle].P2Sail, 2) * wP2;
|
||
152 | end;
|
||
153 | |||
154 | // Newton-Raphson method
|
||
155 | // procedure HessGrad to compute the gradient G and the hessian H of the function at point X
|
||
156 | {$I numhess.inc}
|
||
157 | |||
158 | // Broyden-Fletcher-Goldfarb-Shanno method
|
||
159 | // procedure Gradient to compute the gradient G of the function at point X
|
||
160 | {$I numgrad.inc}
|
||
161 | |||
162 | { TFCalibrage }
|
||
163 | |||
164 | procedure TFCalibrage.FormCreate(Sender: TObject);
|
||
165 | var
|
||
166 | cycle: Integer; |
||
167 | ETPds, ETP2: Extended; |
||
168 | begin
|
||
169 | if Screen.Fonts.IndexOf('Arial Unicode MS') <> -1 |
||
170 | then
|
||
171 | Font.Name := 'Arial Unicode MS';
|
||
172 | TranslateComponent(Self); |
||
173 | // Initialisation des structures
|
||
174 | New(PResSimulT); |
||
175 | DimVector(X, NVar); |
||
176 | X[1] := PProfilT.CoefEntretienGest;
|
||
177 | X[2] := PProfilT.CoefEntretienLact;
|
||
178 | X[3] := PProfilT.RatioLipProt;
|
||
179 | DimVector(G, NVar); |
||
180 | DimMatrix(H_inv, NVar, NVar); |
||
181 | // Poids : moyenne et ?cart type
|
||
182 | DimVector(Pds, 2 * NB_CYCLES);
|
||
183 | for cycle := 2 to NB_CYCLES do |
||
184 | Pds[cycle] := PProfilT.Truies[cycle].PdsSail; |
||
185 | for cycle := 1 to NB_CYCLES do |
||
186 | Pds[NB_CYCLES + cycle] := PProfilT.Truies[cycle].PdsApMB; |
||
187 | MPds := dmath.Mean(Pds, 1, NData);
|
||
188 | ETPds := dmath.StDev(Pds, 1, NData, MPds);
|
||
189 | // Epaisseurs de lard : moyenne et ?cart type
|
||
190 | DimVector(P2, 2 * NB_CYCLES);
|
||
191 | for cycle := 2 to NB_CYCLES do |
||
192 | P2[cycle] := PProfilT.Truies[cycle].P2Sail; |
||
193 | for cycle := 1 to NB_CYCLES do |
||
194 | P2[NB_CYCLES + cycle] := PProfilT.Truies[cycle].P2MB; |
||
195 | MP2 := dmath.Mean(P2, 1, NData);
|
||
196 | ETP2 := dmath.StDev(P2, 1, NData, MP2);
|
||
197 | // Pond?rations
|
||
198 | wPds := 1 ;
|
||
199 | wP2 := Power(ETPds, 2) / Power(ETP2, 2); |
||
200 | // wP2 := StrToFloat(InputBox('Question', 'Pond?ration relative', FloatToStrF(wP2, ffFixed, 15, 2)));
|
||
201 | end;
|
||
202 | |||
203 | procedure TFCalibrage.FormDestroy(Sender: TObject);
|
||
204 | begin
|
||
205 | Dispose(PResSimulT); |
||
206 | end;
|
||
207 | |||
208 | procedure TFCalibrage.FormShow(Sender: TObject);
|
||
209 | var
|
||
210 | cycle, jour: Integer; |
||
211 | PdsSail, P2Sail, PdsMB, P2MB: array[1..NB_CYCLES] of double; |
||
212 | {MPds,} SStPds, SSrPds, {MP2,} SStP2, SSrP2: Float; |
||
213 | {wM, wSStPds, wSSePds,} wSSrPds, {wSStP2, wSSeP2,} wSSrP2: Float; |
||
214 | begin
|
||
215 | ECoefEntGestInitial.Text := FProfilT.PBCoefEntGest.Text; |
||
216 | ECoefEntLactInitial.Text := FProfilT.PBCoefEntLact.Text; |
||
217 | ERatioLipProtInitial.Text := FProfilT.PBRatioLipProt.Text; |
||
218 | // Screen.Cursor := crHourGlass;
|
||
219 | FProfilT.GaugeCalibr.Progress := 0;
|
||
220 | FProfilT.GaugeCalibr.Left := (FProfilT.GraphCalibr.Width - FProfilT.GaugeCalibr.Width) div 2; |
||
221 | FProfilT.GaugeCalibr.Visible := True; |
||
222 | Application.ProcessMessages; |
||
223 | try
|
||
224 | if not QueryPerformanceFrequency(Freq) then Freq := 1; |
||
225 | QueryPerformanceCounter(Start); |
||
226 | case FProfilT.CBMethod.ItemIndex of |
||
227 | 0: Newton(Func, HessGrad, X, 1, NVar, MaxIter, Tol, F_min, G, H_inv, Det); |
||
228 | 1: Marquardt(Func, HessGrad, X, 1, NVar, MaxIter, Tol, F_min, G, H_inv, Det); |
||
229 | 2: BFGS(Func, Gradient, X, 1, NVar, MaxIter, Tol, F_min, G, H_inv); |
||
230 | end;
|
||
231 | finally
|
||
232 | QueryPerformanceCounter(Stop); |
||
233 | // Screen.Cursor:= crDefault;
|
||
234 | FProfilT.GaugeCalibr.Visible := False; |
||
235 | Application.ProcessMessages; |
||
236 | end;
|
||
237 | // Affichage du r?sultat obtenu
|
||
238 | PProfilT.CoefEntretienGest := X[1];
|
||
239 | PProfilT.CoefEntretienLact := X[2];
|
||
240 | PProfilT.RatioLipProt := X[3];
|
||
241 | CalcSimulT(-1, -1, 1, 1, 8, 0, PResSimulT); |
||
242 | FProfilT.AffGraphCal ; |
||
243 | FProfilT.PBCoefEntGest.AsFloat := PProfilT.CoefEntretienGest; |
||
244 | FProfilT.PBCoefEntLact.AsFloat := PProfilT.CoefEntretienLact; |
||
245 | FProfilT.PBRatioLipProt.AsFloat := 1 -PProfilT.RatioLipProt ;
|
||
246 | Application.ProcessMessages; |
||
247 | EMethod.Text := FProfilT.CBMethod.Text; |
||
248 | ETime.Text := FloatToStrF((Stop - Start) / Freq, ffFixed, 15, 3); |
||
249 | ECoefEntGestFinal.Text := FProfilT.PBCoefEntGest.Text; |
||
250 | if (FProfilT.PBCoefEntGest.AsFloat < FProfilT.PBCoefEntGest.MinValue)
|
||
251 | or (FProfilT.PBCoefEntGest.AsFloat > FProfilT.PBCoefEntGest.MaxValue)
|
||
252 | then
|
||
253 | ECoefEntGestFinal.Font.Color := clRed; |
||
254 | ECoefEntLactFinal.Text := FProfilT.PBCoefEntLact.Text; |
||
255 | if (FProfilT.PBCoefEntLact.AsFloat < FProfilT.PBCoefEntLact.MinValue)
|
||
256 | or (FProfilT.PBCoefEntLact.AsFloat > FProfilT.PBCoefEntLact.MaxValue)
|
||
257 | then
|
||
258 | ECoefEntLactFinal.Font.Color := clRed; |
||
259 | ERatioLipProtFinal.Text := FProfilT.PBRatioLipProt.Text; |
||
260 | if (FProfilT.PBRatioLipProt.AsFloat < FProfilT.PBRatioLipProt.MinValue)
|
||
261 | or (FProfilT.PBRatioLipProt.AsFloat > FProfilT.PBRatioLipProt.MaxValue)
|
||
262 | then
|
||
263 | ERatioLipProtFinal.Font.Color := clRed; |
||
264 | // poids et ?paisseur de lard apr?s gestation (mise bas)
|
||
265 | for jour := 2 to PResSimulT.NbJSim do |
||
266 | if (PResSimulT.TabResult[3, jour] = 1) and (PResSimulT.TabResult[3, jour - 1] = 0) |
||
267 | then
|
||
268 | begin
|
||
269 | cycle := Round(PResSimulT.TabResult[2, jour]);
|
||
270 | PdsMB[cycle] := PResSimulT.TabResult[60, jour - 1] + PResSimulT.TabResult[61, jour]; |
||
271 | P2MB[cycle] := PResSimulT.TabResult[67, jour - 1] + PResSimulT.TabResult[68, jour]; |
||
272 | end ;
|
||
273 | // poids et ?paisseur de lard apr?s lactation (saillie)
|
||
274 | for jour := 2 to PResSimulT.NbJSim do |
||
275 | if (PResSimulT.TabResult[3, jour] = 0) and (PResSimulT.TabResult[3, jour - 1] = 2) |
||
276 | then
|
||
277 | begin
|
||
278 | cycle := Round(PResSimulT.TabResult[2, jour]);
|
||
279 | PdsSail[cycle] := PResSimulT.TabResult[60, jour - 1] + PResSimulT.TabResult[61, jour]; |
||
280 | P2Sail[cycle] := PResSimulT.TabResult[67, jour - 1] + PResSimulT.TabResult[68, jour]; |
||
281 | end;
|
||
282 | {
|
||
283 | // Moyennes non pond?r?es
|
||
284 | MPds := 0;
|
||
285 | for cycle := 1 to NB_CYCLES do
|
||
286 | MPds := MPds + PProfilT.Truies[cycle].PdsApMB;
|
||
287 | for cycle := 2 to NB_CYCLES do
|
||
288 | MPds := MPds + PProfilT.Truies[cycle].PdsSail;
|
||
289 | MPds := MPds / NData;
|
||
290 | MP2 := 0;
|
||
291 | for cycle := 1 to NB_CYCLES do
|
||
292 | MP2 := MP2 + PProfilT.Truies[cycle].P2MB;
|
||
293 | for cycle := 2 to NB_CYCLES do
|
||
294 | MP2 := MP2 + PProfilT.Truies[cycle].P2Sail;
|
||
295 | MP2 := MP2 / NData;
|
||
296 | }
|
||
297 | // Somme carr?e des ?carts totaux (non pond?r?s)
|
||
298 | SStPds := 0;
|
||
299 | for cycle := 1 to NB_CYCLES do |
||
300 | SStPds := SStPds + Power(PProfilT.Truies[cycle].PdsApMB - MPds, 2);
|
||
301 | for cycle := 2 to NB_CYCLES do |
||
302 | SStPds := SStPds + Power(PProfilT.Truies[cycle].PdsSail - MPds, 2);
|
||
303 | SStP2 := 0;
|
||
304 | for cycle := 1 to NB_CYCLES do |
||
305 | SStP2 := SStP2 + Power(PProfilT.Truies[cycle].P2MB - MP2, 2);
|
||
306 | for cycle := 2 to NB_CYCLES do |
||
307 | SStP2 := SStP2 + Power(PProfilT.Truies[cycle].P2Sail - MP2, 2);
|
||
308 | // Somme carr?e des ?carts des r?sidus (non pond?r?s)
|
||
309 | SSrPds := 0;
|
||
310 | for cycle := 1 to NB_CYCLES do |
||
311 | SSrPds := SSrPds + Power(PProfilT.Truies[cycle].PdsApMB - PdsMB[cycle], 2);
|
||
312 | for cycle := 2 to NB_CYCLES do |
||
313 | SSrPds := SSrPds + Power(PProfilT.Truies[cycle].PdsSail - PdsSail[cycle], 2);
|
||
314 | SSrP2 := 0;
|
||
315 | for cycle := 1 to NB_CYCLES do |
||
316 | SSrP2 := SSrP2 + Power(PProfilT.Truies[cycle].P2MB - P2MB[cycle], 2);
|
||
317 | for cycle := 2 to NB_CYCLES do |
||
318 | SSrP2 := SSrP2 + Power(PProfilT.Truies[cycle].P2Sail - P2Sail[cycle], 2);
|
||
319 | {
|
||
320 | // Moyenne pond?r?e
|
||
321 | wM := 0;
|
||
322 | for cycle := 1 to NB_CYCLES do
|
||
323 | wM := wM + PProfilT.Truies[cycle].PdsApMB * wPds;
|
||
324 | for cycle := 2 to NB_CYCLES do
|
||
325 | wM := wM + PProfilT.Truies[cycle].PdsSail * wPds;
|
||
326 | for cycle := 1 to NB_CYCLES do
|
||
327 | wM := wM + PProfilT.Truies[cycle].P2MB * wP2;
|
||
328 | for cycle := 2 to NB_CYCLES do
|
||
329 | wM := wM + PProfilT.Truies[cycle].P2Sail * wP2;
|
||
330 | wM := wM / (NData * wPds + NData * wP2);
|
||
331 | // Somme carr?e des ?carts totaux (pond?r?s)
|
||
332 | wSStPds := 0;
|
||
333 | for cycle := 1 to NB_CYCLES do
|
||
334 | wSStPds := wSStPds + Power(PProfilT.Truies[cycle].PdsApMB - wM, 2) * wPds;
|
||
335 | for cycle := 2 to NB_CYCLES do
|
||
336 | wSStPds := wSStPds + Power(PProfilT.Truies[cycle].PdsSail - wM, 2) * wPds;
|
||
337 | wSStP2 := 0;
|
||
338 | for cycle := 1 to NB_CYCLES do
|
||
339 | wSStP2 := wSStP2 + Power(PProfilT.Truies[cycle].P2MB - wM, 2) * wP2;
|
||
340 | for cycle := 2 to NB_CYCLES do
|
||
341 | wSStP2 := wSStP2 + Power(PProfilT.Truies[cycle].P2Sail - wM, 2) * wP2;
|
||
342 | // Somme carr?e des ?carts de pr?diction (pond?r?s)
|
||
343 | wSSePds := 0;
|
||
344 | for cycle := 1 to NB_CYCLES do
|
||
345 | wSSePds := wSSePds + Power(PdsMB[cycle] - wM, 2) * wPds;
|
||
346 | for cycle := 2 to NB_CYCLES do
|
||
347 | wSSePds := wSSePds + Power(PdsSail[cycle] - wM, 2) * wPds;
|
||
348 | wSSeP2 := 0;
|
||
349 | for cycle := 1 to NB_CYCLES do
|
||
350 | wSSeP2 := wSSeP2 + Power(P2MB[cycle] - wM, 2) * wP2;
|
||
351 | for cycle := 2 to NB_CYCLES do
|
||
352 | wSSeP2 := wSSeP2 + Power(P2Sail[cycle] - wM, 2) * wP2;
|
||
353 | }
|
||
354 | // Somme carr?e des ?carts des r?sidus (pond?r?s)
|
||
355 | wSSrPds := 0;
|
||
356 | for cycle := 1 to NB_CYCLES do |
||
357 | wSSrPds := wSSrPds + Power(PProfilT.Truies[cycle].PdsApMB - PdsMB[cycle], 2) * wPds;
|
||
358 | for cycle := 2 to NB_CYCLES do |
||
359 | wSSrPds := wSSrPds + Power(PProfilT.Truies[cycle].PdsSail - PdsSail[cycle], 2) * wPds;
|
||
360 | wSSrP2 := 0;
|
||
361 | for cycle := 1 to NB_CYCLES do |
||
362 | wSSrP2 := wSSrP2 + Power(PProfilT.Truies[cycle].P2MB - P2MB[cycle], 2) * wP2;
|
||
363 | for cycle := 2 to NB_CYCLES do |
||
364 | wSSrP2 := wSSrP2 + Power(PProfilT.Truies[cycle].P2Sail - P2Sail[cycle], 2) * wP2;
|
||
365 | // Affichage des statistiques
|
||
366 | EwPds.Text := FloatToStrF(wPds, ffFixed, 15, 0); |
||
367 | EwP2.Text := FloatToStrF(wP2, ffFixed, 15, 0); |
||
368 | EPVRSD.Text := Format('%1.1f %s', [Sqrt(SSrPds / (NData - Nvar / 2)), StrKg]); |
||
369 | EP2RSD.Text := Format('%1.2f %s', [Sqrt(SSrP2 / (NData - Nvar / 2)), StrMM]); |
||
370 | EPVR2.Text := Format('%1.2f %%', [100 - SSrPds / SStPds * 100]); |
||
371 | EP2R2.Text := Format('%1.2f %%', [100 - SSrP2 / SStP2 * 100]); |
||
372 | EPVVar.Text := Format('%1.2f %%', [wSSrPds / (wSSrPds + wSSrP2) * 100]); |
||
373 | EP2Var.Text := Format('%1.2f %%', [wSSrP2 / (wSSrPds + wSSrP2) * 100]); |
||
374 | ECoefEntGestStDev.Text := FloatToStrF(Sqrt((wSSrPds + wSSrP2) / (2 * NData - Nvar) * H_inv[1, 1]), ffFixed, 15, 5); |
||
375 | ECoefEntLactStDev.Text := FloatToStrF(Sqrt((wSSrPds + wSSrP2) / (2 * NData - Nvar) * H_inv[2, 2]), ffFixed, 15, 5); |
||
376 | ERatioLipProtStDev.Text := FloatToStrF(Sqrt((wSSrPds + wSSrP2) / (2 * NData - Nvar) * H_inv[3, 3]), ffFixed, 15, 5); |
||
377 | case MathErr of |
||
378 | OptNonConv: LInfo.Caption := _('Non-convergence');
|
||
379 | OptSing: LInfo.Caption := _('Singular Hessian matrix');
|
||
380 | OptBigLambda: LInfo.Caption := _('Marquardt parameter too high');
|
||
381 | else
|
||
382 | if (FProfilT.PBCoefEntGest.AsFloat < FProfilT.PBCoefEntGest.MinValue)
|
||
383 | or (FProfilT.PBCoefEntGest.AsFloat > FProfilT.PBCoefEntGest.MaxValue)
|
||
384 | or (FProfilT.PBCoefEntLact.AsFloat < FProfilT.PBCoefEntLact.MinValue)
|
||
385 | or (FProfilT.PBCoefEntLact.AsFloat > FProfilT.PBCoefEntLact.MaxValue)
|
||
386 | or (FProfilT.PBRatioLipProt.AsFloat < FProfilT.PBRatioLipProt.MinValue)
|
||
387 | or (FProfilT.PBRatioLipProt.AsFloat > FProfilT.PBRatioLipProt.MaxValue)
|
||
388 | then
|
||
389 | LInfo.Caption := _('Suspicious result')
|
||
390 | else
|
||
391 | LInfo.Visible := False; |
||
392 | end;
|
||
393 | end;
|
||
394 | |||
395 | end. |