Jak wyliczyć zaburzenie dokładności Hornera?

Własności wielomianów; pierwiastki, współczynniki. Dzielenie wielomianów. Wzory Viete'a. RÓWNANIA I NIERÓWNOŚCI wielomianowe (wyższych stopni). Rozkład na czynniki.
Awatar użytkownika
Borneq
Użytkownik
Użytkownik
Posty: 247
Rejestracja: 23 lip 2010, o 07:50
Płeć: Mężczyzna
Lokalizacja: geo:lat=0 geo:lon=0
Podziękował: 13 razy

Jak wyliczyć zaburzenie dokładności Hornera?

Post autor: Borneq »

Na razie próbuję:

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;
}
Ale wyniki mam
(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)
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.

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;
}
-- 6 lis 2016, o 11:34 --Prawidłowa estymacja błędu:
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.
ODPOWIEDZ