92 private double[] x, y, weight;
109 if (x.length != y.length)
110 throw new IllegalArgumentException(
"x.length != y.length");
111 if (w !=
null && x.length != w.length)
112 throw new IllegalArgumentException(
"x.length != w.length");
113 if (rho < 0 || rho > 1)
114 throw new IllegalArgumentException(
"rho not in [0, 1]");
121 weight =
new double[x.length];
123 for (
int i = 0; i < weight.length; i++)
126 for (
int i = 0; i < weight.length; i++)
146 this(x, y,
null, rho);
158 return splineVector[i].evaluate(z - x[0]);
160 return splineVector[i].evaluate(z - x[i - 1]);
179 retour = splineVector[iB].integral(a - x[iB], b - x[iB]);
182 retour = splineVector[iA].integral(a - x[iA], 0);
184 retour = splineVector[iA].integral(a - x[iA], x[iA + 1] - x[iA]);
185 for (i = iA + 1; i < iB; i++) {
186 retour += splineVector[i].integral(0, x[i + 1] - x[i]);
188 retour += splineVector[iB].integral(0, b - x[iB]);
203 return splineVector[i].derivative(z - x[0]);
205 return splineVector[i].derivative(z - x[i - 1]);
219 return splineVector[i].derivative(z - x[0], n);
221 return splineVector[i].derivative(z - x[i - 1], n);
266 return splineVector.clone();
282 int j = this.x.length - 1;
289 if (x > this.x[tmp]) {
291 tmp = i + (j - i) / 2;
294 tmp = i + (j - i) / 2;
302 private void resolve() {
308 double[] h =
new double[x.length];
309 double[] r =
new double[x.length];
310 double[] u =
new double[x.length];
311 double[] v =
new double[x.length];
312 double[] w =
new double[x.length];
313 double[] q =
new double[x.length + 1];
314 double[] sigma =
new double[weight.length];
316 for (
int i = 0; i < weight.length; i++) {
317 if (weight[i] <= 0.0)
320 sigma[i] = 1.0 / Math.sqrt(weight[i]);
324 int n = x.length - 1;
329 mu = 2 * (1 - rho) / (3 * rho);
333 for (
int i = 1; i < n; i++) {
334 h[i] = x[i + 1] - x[i];
336 q[i] = 3 * (y[i + 1] - y[i]) / h[i] - 3 * (y[i] - y[i - 1]) / h[i - 1];
339 for (
int i = 1; i < n; i++) {
340 u[i] = r[i - 1] * r[i - 1] * sigma[i - 1] + (r[i - 1] + r[i]) * (r[i - 1] + r[i]) * sigma[i]
341 + r[i] * r[i] * sigma[i + 1];
342 u[i] = mu * u[i] + 2 * (x[i + 1] - x[i - 1]);
343 v[i] = -(r[i - 1] + r[i]) * r[i] * sigma[i] - r[i] * (r[i] + r[i + 1]) * sigma[i + 1];
344 v[i] = mu * v[i] + h[i];
345 w[i] = mu * r[i] * r[i + 1] * sigma[i + 1];
347 q = Quincunx(u, v, w, q);
350 double[] params =
new double[4];
352 params[0] = y[0] - mu * r[0] * q[1] * sigma[0];
353 dd = y[1] - mu * ((-r[0] - r[1]) * q[1] + r[1] * q[2]) * sigma[1];
354 params[1] = (dd - params[0]) / h[0] - q[1] * h[0] / 3;
358 params[0] = y[0] - mu * r[0] * q[1] * sigma[0];
359 dd = y[1] - mu * ((-r[0] - r[1]) * q[1] + r[1] * q[2]) * sigma[1];
360 params[3] = q[1] / (3 * h[0]);
362 params[1] = (dd - params[0]) / h[0] - q[1] * h[0] / 3;
367 for (j = 1; j < n; j++) {
368 params[3] = (q[j + 1] - q[j]) / (3 * h[j]);
370 params[1] = (q[j] + q[j - 1]) * h[j - 1] + splineVector[j].getCoefficient(1);
371 params[0] = r[j - 1] * q[j - 1] + (-r[j - 1] - r[j]) * q[j] + r[j] * q[j + 1];
372 params[0] = y[j] - mu * params[0] * sigma[j];
380 params[1] = splineVector[j].derivative(x[x.length - 1] - x[x.length - 2]);
381 params[0] = splineVector[j].evaluate(x[x.length - 1] - x[x.length - 2]);
382 splineVector[n + 1] =
new Polynomial(params);
385 private static double[] Quincunx(
double[] u,
double[] v,
double[] w,
double[] q) {
391 for (j = 2; j < u.length - 1; j++) {
392 u[j] = u[j] - u[j - 2] * w[j - 2] * w[j - 2] - u[j - 1] * v[j - 1] * v[j - 1];
393 v[j] = (v[j] - u[j - 1] * v[j - 1] * w[j - 1]) / u[j];
398 q[1] = q[1] - v[0] * q[0];
399 for (j = 2; j < u.length - 1; j++) {
400 q[j] = q[j] - v[j - 1] * q[j - 1] - w[j - 2] * q[j - 2];
402 for (j = 1; j < u.length - 1; j++) {
408 for (j = u.length - 3; j > 0; j--) {
409 q[j] = q[j] - v[j] * q[j + 1] - w[j] * q[j + 2];