Kod: Zaznacz cały
double estimEps(double x, int n, double *P)
{
if (n<0) return 0;
double error = fabs(P[n]);
for (int i = n - 1; i >= 0; i--)
{
error = error*fabs(x);
error = std::max(error, fabs(P[i]));
}
return error;
}
gdzie w pierwszej kolumnie to pierwiastek, maxE to maksymalny błąd zaburzonego pierwiastka po odjęciu już błędu systematycznego pochodnej, estError to próba wyliczenia moim, a w nawiasie ile razy za dużo.(x + 2)(x + 1)(x - 1)(x - 2)(x - 3)(x - 4)
-2.000000: maxE = 616.000000, estError = 280.000000 (0.454545)
-1.000000: maxE = 64.000000, estError = 56.000000 (0.875000)
1.000000: maxE = 36.000000, estError = 56.000000 (1.555556)
2.000000: maxE = 152.000000, estError = 280.000000 (1.842105)
3.000000: maxE = 528.000000, estError = 1701.000000 (3.221591)
4.000000: maxE = 1540.000000, estError = 7168.000000 (4.654545)
(x+3)(x+2)(x+1)(x-1)(x-2)(x-3)
-3.000000: maxE = 448.000000, estError = 1134.000000 (2.531250)
-2.000000: maxE = 172.000000, estError = 224.000000 (1.302326)
-1.000000: maxE = 32.000000, estError = 49.000000 (1.531250)
1.000000: maxE = 32.000000, estError = 49.000000 (1.531250)
2.000000: maxE = 172.000000, estError = 224.000000 (1.302326)
3.000000: maxE = 448.000000, estError = 1134.000000 (2.531250)
Dodałem współczynniki:
Kod: Zaznacz cały
double estimEps(double x, int n, double *P)
{
if (n<0) return 0;
double error = fabs(P[n]);
for (int i = n - 1; i >= 0; i--)
{
error = error*fabs(x*0.707);
error = std::max(error, 1.4*fabs(P[i]));
}
return error;
}
double estimEps(double x, int n, double *P)
{
if (n<0) return 0;
double value = P[n];
double esterror = 0;
for (int i = n - 1; i >= 0; i--)
{
value *= x;
double esterror1 = esterror*x;
double esterror2 = 0.35* value;
esterror = sqrt(esterror1*esterror1 + esterror2*esterror2);
value += P;
esterror = std::max(esterror, fabs(0.35*value));
}
return esterror;
}
Problem że liczenie trwa dłużej niż wartość wielomianu Hornerem.