Kwadratura Gaussa-Hermite

Całkowalność. Metody i obliczanie całek oznaczonych i nieoznaczonych. Pole pod wykresem. Równania i nierówności z wykorzystaniem rachunku całkowego. Wielowymiarowa całka Riemanna - w tym pola i objętości figur przestrzennych.
lubiemisia
Użytkownik
Użytkownik
Posty: 5
Rejestracja: 20 lis 2009, o 20:11
Płeć: Mężczyzna
Lokalizacja: Na fotelu

Kwadratura Gaussa-Hermite

Post autor: lubiemisia »

Cześć wszystkim. Prosiłbym wszystkich o pomoc w rozwiązaniu tej całki kwadraturami Gaussa-Hermite'a.
Chciałbym się dowiedzieć jak się je rozwiązuje a nie ma w necie za bardzo przykładów tylko sucha teoria:

\(\displaystyle{ \int_{-5}^{5} e^{-x ^{2}}(1-x) dx}\)

prosiłbym również o komentarze przy rozwiązaniu:P
wiem że sporo wymagam ale liczę że znajdzie się ktoś kto mi pomoże szczególnie że znam zagadnienie ale nie na tyle żebym umiał rozwiązać takie zadanie...
Awatar użytkownika
Vigl
Użytkownik
Użytkownik
Posty: 283
Rejestracja: 28 wrz 2007, o 12:19
Płeć: Mężczyzna
Lokalizacja: Krosno/Kraków
Podziękował: 13 razy
Pomógł: 67 razy

Kwadratura Gaussa-Hermite

Post autor: Vigl »

\(\displaystyle{ \int_{-5}^5e^{-x^2}(1-x)dx=\Sigma_{j=1}^n w_je^{-x_j^2}(1-x_j)}\),
gdzie węzły kwadratury \(\displaystyle{ x_j}\) to kolejne zera wielomianu Hermite'a. Ciężko tu dodać coś więcej jeżeli chodzi o teorię. Rozwiązanie to już inna sprawa. :) Schemat jest banalny - znajdź zera w. Hermite'a oraz współczynniki \(\displaystyle{ w_j}\) w zadanym przedziale oraz przy określonej liczbie podziałów n i podstaw. :) Z kolei techniczne wykonanie niekoniecznie już jest tak trywialne, a na pewno czasochłonne.

Jeżeli chcesz to scałkować w ten sposób, to najlepszym rozwiązaniem będzie użycie gotowej procedury numerycznej (e.g. numerical recipes C (or fortran), subroutine gauher).
lubiemisia
Użytkownik
Użytkownik
Posty: 5
Rejestracja: 20 lis 2009, o 20:11
Płeć: Mężczyzna
Lokalizacja: Na fotelu

Kwadratura Gaussa-Hermite

Post autor: lubiemisia »

Vigl pisze:\(\displaystyle{ \int_{-5}^5e^{-x^2}(1-x)dx=\Sigma_{j=1}^n w_je^{-x_j^2}(1-x_j)}\)
a czy nie jest to tak że:
\(\displaystyle{ \int_{-5}^5e^{-x^2}(1-x)dx=\Sigma_{j=1}^n w_j(1-x_j)}\)
gdzie,
\(\displaystyle{ w_j=e^{-x_j^2}}\)
bo to wyrażenie to właśnie ta waga chyba...
ja mam problem jak tą całkę ograniczyć do jakiegoś przedziału, (tutaj -5,5)
Vigl pisze:Jeżeli chcesz to scałkować w ten sposób, to najlepszym rozwiązaniem będzie użycie gotowej procedury numerycznej (e.g. numerical recipes C (or fortran), subroutine gauher).
no właśnie ja chcę napisać to w cpp ale muszę poznać dokładnie metodę jak działa na zadanym przedziale
i do tego potrzebuje rozwiązania chociaż jednego przykładu
Awatar użytkownika
Vigl
Użytkownik
Użytkownik
Posty: 283
Rejestracja: 28 wrz 2007, o 12:19
Płeć: Mężczyzna
Lokalizacja: Krosno/Kraków
Podziękował: 13 razy
Pomógł: 67 razy

Kwadratura Gaussa-Hermite

Post autor: Vigl »

lubiemisia pisze:
Vigl pisze:\(\displaystyle{ \int_{-5}^5e^{-x^2}(1-x)dx=\Sigma_{j=1}^n w_je^{-x_j^2}(1-x_j)}\)
a czy nie jest to tak że:
\(\displaystyle{ \int_{-5}^5e^{-x^2}(1-x)dx=\Sigma_{j=1}^n w_j(1-x_j)}\)
gdzie,
\(\displaystyle{ w_j=e^{-x_j^2}}\)
bo to wyrażenie to właśnie ta waga chyba...
No właśnie z w_j jest kłopotliwa sprawa, bo:
\(\displaystyle{ \int f(x)dx=\int p(x)q(x)dx=\Sigma w_jf(x_j),}\)
gdzie wagą jest \(\displaystyle{ p(x)=e^{-x^2}}\). To nam mówi, jak rozłożyć nasze \(\displaystyle{ f(x)}\), jednak nie mówi o współczynnikach \(\displaystyle{ w_j}\). Też wcześniej myślałem, że w_j to ta sama waga co p(x), jednak nie jest tak do końca. W zasadzie jest to logiczne, gdyż \(\displaystyle{ w_j}\) pojawia się dopiero w sumie, będącej przybliżeniem całki i odpowiada szerokości danego podprzedziału całkowania \(\displaystyle{ \Delta x}\).
(Analogicznie do wzoru Riemanna: l\(\displaystyle{ im_{n-->\infty}\Sigma_{i=1}^n f(x_i)\Delta x_i=\int f(x)dx}\) - \(\displaystyle{ w_j}\) odpowiada \(\displaystyle{ \Delta x_i}\), brak jedynie przejścia granicznego, ale w końcu to metody numeryczne :) .) Jak z kolei \(\displaystyle{ w_j}\) wyznaczyć - nie wiem. :) Na pewno jest zależne od n i od zer w. Hermite'a, jednak nie wiem jaka to zależność.

Jeśli chcesz, to do następnego postu mogę dodać procedurę gauher w C, żebyś mógł zobaczyć jak ona wygląda i samodzielnie przeanalizować co i jak. :)
lubiemisia
Użytkownik
Użytkownik
Posty: 5
Rejestracja: 20 lis 2009, o 20:11
Płeć: Mężczyzna
Lokalizacja: Na fotelu

Kwadratura Gaussa-Hermite

Post autor: lubiemisia »

oki.. jak możesz to podaj mi ten fragment kodu w c to może się domyśle :]
-- 22 lis 2009, o 16:45 --odświeżam, jeśli ma ktoś jeszcze jakieś pomysły jak to rozwiązać to chętnie zapraszam:)
Awatar użytkownika
Vigl
Użytkownik
Użytkownik
Posty: 283
Rejestracja: 28 wrz 2007, o 12:19
Płeć: Mężczyzna
Lokalizacja: Krosno/Kraków
Podziękował: 13 razy
Pomógł: 67 razy

Kwadratura Gaussa-Hermite

Post autor: Vigl »

Proszę

Kod: Zaznacz cały

#include <math.h>
#define EPS 3.0e-14
#define PIM4 0.7511255444649425
#define MAXIT 10

void gauher(float x[], float w[], int n)
{
	void nrerror(char error_text[]);
	int i,its,j,m;
	double p1,p2,p3,pp,z,z1;

	m=(n+1)/2;
	for (i=1;i<=m;i++) {
		if (i == 1) {
			z=sqrt((double)(2*n+1))-1.85575*pow((double)(2*n+1),-0.16667);
		} else if (i == 2) {
			z -= 1.14*pow((double)n,0.426)/z;
		} else if (i == 3) {
			z=1.86*z-0.86*x[1];
		} else if (i == 4) {
			z=1.91*z-0.91*x[2];
		} else {
			z=2.0*z-x[i-2];
		}
		for (its=1;its<=MAXIT;its++) {
			p1=PIM4;
			p2=0.0;
			for (j=1;j<=n;j++) {
				p3=p2;
				p2=p1;
				p1=z*sqrt(2.0/j)*p2-sqrt(((double)(j-1))/j)*p3;
			}
			pp=sqrt((double)2*n)*p2;
			z1=z;
			z=z1-p1/pp;
			if (fabs(z-z1) <= EPS) break;
		}
		if (its > MAXIT) nrerror("too many iterations in gauher");
		x[i]=z;
		x[n+1-i] = -z;
		w[i]=2.0/(pp*pp);
		w[n+1-i]=w[i];
	}
}
#undef EPS
#undef PIM4
#undef MAXIT
/* (C) Copr. 1986-92 Numerical Recipes Software 7&X*. */
Oczywiście to sucha procedura. Do niej musisz sobie napisać banalny sterownik, w którym zdefiniujesz funkcję jaką chcesz całkować i wywołasz dla niej gauher-a.
ODPOWIEDZ