[C#] Interpolacja funkcjami sklejanymi

bolok
Użytkownik
Użytkownik
Posty: 39
Rejestracja: 13 maja 2007, o 15:18
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 14 razy

[C#] Interpolacja funkcjami sklejanymi

Post autor: bolok »

Witam, mam do napisania program taki jak w temacie.

Tyle już mam (chyba to jest dobrze):

Kod: Zaznacz cały

using System;

namespace zad
{
    class Program
    {
        static double[] Gauss(double[,] A){
            int n = A.GetLength(0);
            double[] x = new double[n];
            double max = 0;
            int r = 0;
            // wyszukiwanie elementu MAX
            for (int k = 0; k < n; k++){
                max = A[k, k];
                r = k;
                for (int i = k; i < n; i++) {
                    if (Math.Abs(A[i, k]) > Math.Abs(max)){
                        max = A[i, k];
                        r = i;}}
                if (max == 0){
                    Console.WriteLine("Macierz ukladu osobliwa!");
                    break;
                } else {
                    for (int j = k; j <= n; j++){
                        // zamiana wierszy k z r
                        double temp = A[k, j];
                        A[k, j] = A[r, j];
                        A[r, j] = temp; }
                    // utworzenie macierzy trojkatnej gornej
                    for (int i = k + 1; i < n; i++)
                        for (int j = k + 1; j <= n; j++)
                            A[i, j] = A[i, j] - ((A[i, k] / max) * A[k, j]);}
                if (max != 0)
                    // wyliczanie zmiennych od ostatniej do pierwszej
                    for (int i = n - 1; i >= 0; i--){
                        double s = 0;
                        for (int m = i + 1; m < n; m++)
                            s = s + A[i, m] * x[m];
                        x[i] = (A[i, n] - s) / A[i, i]; }}
            // wyswietlenie wynikow
            for (int i = 0; i < n; i++)
                Console.WriteLine("C[{0}] = {1}; ", i, x[i]);
            return x;}

        static double[,] wyp_macierz(int n, double[,] tab, double[] y, double h, double alfa1, double beta1)
        {
            //WYPELNIAMY MACIERZ ZERAMI
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n + 1; j++)
                {
                    if (i == j)
                        tab[i, j] = 4;
                    else if (i == 0 && j == 1)
                        tab[i, j] = 2;
                    else if (i == n - 1 && j == n - 2)
                        tab[i, j] = 2;
                    else if (j == i - 1)
                        tab[i, j] = 1;
                    else if (i == j - 1)
                        tab[i, j] = 1;
                    else
                        tab[i, j] = 0;
                }
            }
            for (int i = 0; i < n; i++)
                for (int j = 0; j < n + 1; j++)
                    if (j == n)
                    {
                        tab[i, j] = y[i];
                        if (i == 0)
                            tab[i, j] = y[i] + ((1 / 3) * h * alfa1);
                        else if (i == n)
                            tab[i, j] = y[i] + ((1 / 3) * h * beta1);
                    }
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n + 1; j++)
                    Console.Write(tab[i, j] + " ");
                Console.WriteLine();
            }
            return tab;
        }

        static double[] f(double[] x)
        {
            int n = x.Length;
            double[] fx = new double[n];
            for (int i = 0; i < n; i++)
                fx[i] = 1 / (1 + (x[i] * x[i]));
            return fx;
        }

        static void Main(string[] args)
        {
            int n = 10;
            double[,] tab = new double[n, n + 1];
            double a = -1, b = 1;
            double x = 0;
            double alfa1 = 0.5, beta1 = -0.5;
            double h = (b - a) / n;
            double m = (x - a) / h;
            double t = ((x - a) / h) - m;
            double[] xx = new double[n];
            double[] y = new double[n];
            double[] C = new double[n];
            for (int i = 0; i < n; i++)
                xx[i] = a + i * h;
            y = f(xx);
            for (int i = 0; i < n; i++)
                Console.WriteLine("x={0} .........y= {1}", xx[i], y[i]);
            Console.WriteLine();
            C = Gauss(wyp_macierz(n, tab, y, h, alfa1, beta1));
            Console.ReadLine();
        }
    }
}
Teraz musze zastosować następujący wzór:

\(\displaystyle{ s(x)=\sum_{i=-1}^{n+1}c_i\Phi_i^3(x) \mbox{ gdzie: }a\leq x\leq b\;}\)

Tylko nierozumiem jak programistycznie zastosowac ten wzór. Mam n elementów w wektorze Ci to skąd nagle mam ich wziąść n+2? Znalazłem również wzór na \(\displaystyle{ \Phi_i^3(x)}\) i zapisałem go tak:

Kod: Zaznacz cały

for (int i = 0; i < n; i++)
            {
               if (punkt >= x[i - 2] && punkt <= x[i - 1])
                    FI[i] = (1 / Math.Pow(h, 3)) * Math.Pow(punkt - x[i - 2], 3);
                else if (punkt >= x[i - 2] && punkt <= x[i - 1])
                    FI[i] = (1 / Math.Pow(h, 3)) * (Math.Pow(h, 3) + 3 * Math.Pow(h, 2) * (punkt - x[i - 1]) + 3 * h * Math.Pow((punkt - x[i - 1]), 2) - 3 * Math.Pow((punkt - x[i - 1]), 3));
                if (punkt >= x[i - 1] && punkt <= x[i])
                    FI[i] = (1 / Math.Pow(h, 3)) * (Math.Pow(h, 3) + 3 * Math.Pow(h, 2) * (x[i + 1] - punkt) + 3 * h * Math.Pow((x[i + 1] - punkt), 2) - 3 * Math.Pow((x[i + 1] - punkt), 3));          
                else if (punkt >= x[i] && punkt <= x[i + 1] && i<n-2)
                    FI[i] = (1 / Math.Pow(h, 3)) * Math.Pow((x[i + 2] - punkt), 3);
                else
                    FI[i] = 0;
            }
Tylko teraz trzeba jakoś "ogarnąć" indeksy tablic bo tak jak jest jest źle. Trzeba pewnie jakiś warunki nałożyć na te warunki co już napisałem. Pomoże ktoś?


Z góry dzięki za każdą rade
Ostatnio zmieniony 25 lis 2011, o 10:42 przez bolok, łącznie zmieniany 3 razy.
Xitami

[C#] Interpolacja funkcjami sklejanymi

Post autor: Xitami »

czemu niekonsekwentnie nie każdy drugi wiesz jest pusty? zobacz:

podstawowe pytanie: sklejać można różności, odcinki, parabole,... co kleisz?

zauważyłem \(\displaystyle{ \frac{1}{h^3}h^3\dots}\) dziwne,

O schemacie Hornera słyszałeś?
\(\displaystyle{ ax^2+bx+c=(ax+b)x+c}\)
bolok
Użytkownik
Użytkownik
Posty: 39
Rejestracja: 13 maja 2007, o 15:18
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 14 razy

[C#] Interpolacja funkcjami sklejanymi

Post autor: bolok »

Xitami pisze:czemu niekonsekwentnie nie każdy drugi wiesz jest pusty? zobacz:

podstawowe pytanie: sklejać można różności, odcinki, parabole,... co kleisz?

zauważyłem \(\displaystyle{ \frac{1}{h^3}h^3\dots}\) dziwne,

O schemacie Hornera słyszałeś?
\(\displaystyle{ ax^2+bx+c=(ax+b)x+c}\)
Przepraszam za tą niekonsekwencje.

Dokładniej chodzi mi o wyznaczanie interpolacji funkcji sklejanych w przypadku równoodległych węzłów. Wzory na węzły:
\(\displaystyle{ x_{i} = a + i*h ; i=0,1 ...n}\)
\(\displaystyle{ h = \frac{b-a}{n}}\)
\(\displaystyle{ y_{i} = f(xi)}\)
\(\displaystyle{ f(xi) = \frac{1}{ 1 + x(i)^{2} }}\)

Dane do zadania:
\(\displaystyle{ \alpha = 0.5}\)
\(\displaystyle{ \beta = -0.5}\)
\(\displaystyle{ a = -1}\)
\(\displaystyle{ b = 1}\)
\(\displaystyle{ n = 10}\)

Macierz z której obliczam metodą Gaussa rozwiązania wygląda następująco:



do tak wyglądającej macierzy dodaje jako n+1 kolumne następujący wektor:
\(\displaystyle{ \begin{bmatrix} y_{0} + \frac{1}{3}h* \alpha \\y1 \\...\\y_{n} + \frac{1}{3}h* \beta \end{bmatrix}}\)

Tak zapisaną macierz przekazuje jako parametr do funkcji Gauss w wyniku czego powstaje mi wektor \(\displaystyle{ C_{i}}\).

Tak wygląda moja poprawiona funkcja na Fi:

Kod: Zaznacz cały

static double[] funkcja_fi(double punkt, double []x, double h)
        {
            int n = x.Length;
            double[] FI = new double[n];
            for (int i = 0; i < n; i++)
            {
                if( i != 0 && i != 1)
                {
                    if (punkt >= x[i - 2] && punkt <= x[i - 1])
                        FI[i] = (1 / Math.Pow(h, 3)) * ( Math.Pow(punkt - x[i - 2], 3) );  
                }
                else if( i != 0)
                {
                    if (punkt >= x[i - 1] && punkt <= x[i])
                        FI[i] = (1 / Math.Pow(h, 3)) * ( (Math.Pow(h, 3) + ((3 * Math.Pow(h, 2)) * (punkt - x[i - 1])) + 3 * h * Math.Pow((punkt - x[i - 1]), 2) - (3 * Math.Pow((punkt - x[i - 1]), 3))) );  
                }
                else if (i < n - 1)
                {
                    if (punkt >= x[i] && punkt <= x[i+1])
                        FI[i] = (1 / Math.Pow(h, 3)) * ((Math.Pow(h, 3) + (3 * Math.Pow(h, 2)) * (x[i + 1] - punkt) + (3 * h * Math.Pow((x[i + 1] - punkt), 2) - 3 * Math.Pow((x[i + 1] - punkt), 3))));
                }
                else if( i < n -1 && i < n-2 )
                {
                    if (punkt >= x[i+1] && punkt <= x[i + 2])
                         FI[i] = (1 / Math.Pow(h, 3)) * Math.Pow((x[i + 2] - punkt), 3);
                }
                else
                {
                    FI[i] = 0;
                }
                Console.WriteLine(FI[i]);
            }
            return FI;
        }
A tak wygląda funkcja interpolująca:

Kod: Zaznacz cały

W = funkcja_fi(x, xx, h);
....
 static void interpolacja(double[] c, double[] W, double x)
        {
            int n = c.Length;
            double S=0;
            for (int i = 0; i < n; i++)
            {
                S += (c[i] * W[i]);
            }
            Console.WriteLine("S ({0}) = {1}",x,S);
        }
I teraz po wpisaniu wartości x (punktu w którym badamy interpolacje) powinien wyjść w przybliżeniu punkt y. Tylko coś jest nie tak bo program liczy dobrze tylko dla x = -0.8, dla pozostałych x-ów z wektora xi wartości y są błędne. Ktoś wie co jest nie tak? Mi się wydaje że coś nie tak jest z tą sumą:

\(\displaystyle{ s(x)=\sum_{i=-1}^{n+1}c_i\Phi_i^3(x) \mbox{ gdzie: }a\leq x\leq b\;}\)

bo według tego jak ja licze to omijam dwa elementy. Tylko teraz nie wiem czy któreś czeba dodać dwukrotnie czy jak? Ja już powoli nie mam pomysłów ...

Z góry dzięki za każdą pomoc
Xitami

[C#] Interpolacja funkcjami sklejanymi

Post autor: Xitami »

czym jest \(\displaystyle{ \alpha}\) a czym \(\displaystyle{ \beta}\) ?
coś mi nie gra, funkcje sklejane sklejamy po to by ułatwić sobie życie
(bo znalezienie funkcji interpolującej przechodzącej przez wszystkie zadane punkty jest trudne)
a u ciebie wygląda mi, że próbujesz do wszystkich danych dopasować jedną krzywą
przy wielkim szczęściu się uda, miałeś go mniej i trafiłeś tylko w jeden punkt

ja rozumiem zadanie tak:
mamy przedział [a, b], nasza niewiadoma funkcja w n+1 punktach (\(\displaystyle{ x_i=a+ih}\)) przyjmuje wartości \(\displaystyle{ y_i=\frac{1}{1+(x_i)^2}}\)
i teraz, dla pewnego x wybieram jakieś jego otoczenie, dla tego otoczenia szukam wielomianu interpolującego i do niego podstawiam ten konkretny x
otoczenie to mogą być np. dwa punkty \(\displaystyle{ x_i<x<x_{i+1}}\), przez dwa punkty jednoznacznie można przeprowadzić tylko parabolę pierwszego stopnia, ale można i wyższego gdy zadbać np. o ciągłość drugiej pochodnej w zadanych węzłach
bolok
Użytkownik
Użytkownik
Posty: 39
Rejestracja: 13 maja 2007, o 15:18
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 14 razy

[C#] Interpolacja funkcjami sklejanymi

Post autor: bolok »

Xitami pisze: mamy przedział [a, b], nasza niewiadoma funkcja w n+1 punktach (\(\displaystyle{ x_i=a+ih}\)) przyjmuje wartości \(\displaystyle{ y_i=\frac{1}{1+(x_i)^2}}\)
Punktów jest n, nie n+1. n+1 jest kolumn w macierzy, ponieważ w ostatniej kolumnie są wartości \(\displaystyle{ y_i}\)

Z tego co pisze w książce "Metody numeryczne Fortuna, Macukow, Wasowski" w której niby miał znajdować się opis tego problemu, to:
\(\displaystyle{ \alpha 1}\) , \(\displaystyle{ \beta 1}\) są określonymi liczbami rzeczywistymi, i zachodzą następujące warunki:

\(\displaystyle{ s(x_{i}) = f(x_{i}) = y_{i}}\)
\(\displaystyle{ s'(a+0)= \alpha 1}\)
\(\displaystyle{ s'(b+0)= \beta 1}\)

Z tego co zapamiętałem z laboratorium to dla węzłów (x-ów) początkowych miały wartości (y) być wmiarę dokładnie przybliżone, a później miało się to coraz bardzie rozchodzić (więc trzeba sprawdzać dla początkowych wartości). Dodatkowo do sprawdzenia poprawności obliczeń był podany taki wzór:

Kod: Zaznacz cały

double p = C[(int)m - 1] * Math.Pow(1 - t, 3) + C[(int)m] * ((Math.Pow(2 - t, 3) - 4 * (Math.Pow(1 - t, 3))) + C[(int)m + 1] * ((Math.Pow(1 + t, 3) - 4 * Math.Pow(t, 3)) ) + C[(int) m+2]*Math.Pow(t,3) );
            Console.WriteLine("

P:" + p);
Dla x=0, miało wyjść ok. 1 (mi wychodzi 0.85 ale to może wina rzutowania ?).

Tak wygląda funkcja \(\displaystyle{ \Phi}\) w zapisie matematycznym:

\(\displaystyle{ \Phi_i^3(x)={{1}\over{h^3}}\begin{cases}
(x-x_{i-2})^2&\mbox{ dla } x\in\langle x_{i-2}-x_{i-1}\rangle\\
h^3+3h^2(x-x_{i-1})+3h(x-x_{i-1})^2-3(x-x_{i-1})^3&\mbox{ dla }x\in\langle x_{i-1};x_i\rangle\\
h^3+3h^2(x_{i+1}-x)+3h(x_{i+1}-x)^2-3(x_{i+1}-x)^3&\mbox{ dla }x\in\langle x_i;x_{i+1}\rangle\\
(x_{i+2}-x)^3&\mbox{ dla }x\in\langle x_{i+i};x_{i+2}\rangle \\
0&\mbox{ dla pozostałych }x\in R
\end{cases}\;}\)


Może p oprostu ja to jakoś zapisałem źle (tą funkcje \(\displaystyle{ \Phi}\)) i dlatego są złe wynik? Między \(\displaystyle{ \frac{1}{ h^{3} }}\) a resztą w klamrach na pewno ma być razy?
Ostatnio zmieniony 25 lis 2011, o 16:20 przez bolok, łącznie zmieniany 1 raz.
Xitami

[C#] Interpolacja funkcjami sklejanymi

Post autor: Xitami »

sam napisałeś, że i=0,1,...,n - więc? n czy n+1?
a nawet
\(\displaystyle{ s(x)=\sum_{i=-1}^{n+1}\dots}\)
sugeruje, że mamy układ n+3 równań

to "rozchodzenie" to
ale raczej nie o to tu chodzi (sklejamy bo interpolacja wielomianem stopnia n prowadzić może do sporych błędów)

podumam jeszcze w wolnej chwili
bolok
Użytkownik
Użytkownik
Posty: 39
Rejestracja: 13 maja 2007, o 15:18
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 14 razy

[C#] Interpolacja funkcjami sklejanymi

Post autor: bolok »

Generalnie opis tego zagadnienia jest w dziale Interpolacja w ksiązce "Metody numeryczne Fortuna, Macukow, Wasowski" (w szczególności strony 70-72). Tylko ja nie za bardzo rozumiem niektórych rzeczy, o których pisze autor (a raczej autorowie). Szkoda, że Ty nie masz tej książki pod ręką po na pewno byś prędzej zajarzył o co biega ode mnie.

No masz racje, mój błąd. Tymi pozostałymi dwoma równaniami mają być chyba takie równania:

\(\displaystyle{ - c _{-1} + c_{1} = \frac{h}{3} * \alpha 1}\)
\(\displaystyle{ - c _{n-1} + c_{n+1} = \frac{h}{3} * \beta 1}\)

no a to 3 równanie to nie wiem i nie wiem też jak to zaimplementować w programie...

edit----------------

Nowe warunki zapisałem tak:

Kod: Zaznacz cały

double[] Cplus2 = new double[n+2];
            double c1 = 0, cp = 0;
            for (int i = 0; i < n; i++)
            {
                if (i == 1)
                    c1 = C[i];
                else if (i == n-2)
                    cp = C[i];
            }
            for (int i = 0; i < n+2; i++)
            {
                if(i==0)
                    Cplus2[i] = - h/3*alfa1 + c1;
                else if(i == n+1 )
                    Cplus2[i] =  h/3*beta1 + cp;
                else if(i < n)
                    Cplus2[i] = C[i];
            }
Wektor \(\displaystyle{ \phi}\) też powiększyłem o te dwa elementy, ale nic to nie zmieniło. Wyniki są takie same
Xitami

[C#] Interpolacja funkcjami sklejanymi

Post autor: Xitami »

bolok pisze: \(\displaystyle{ x_{i} = a + i*h ; i=0,1 ...n}\)
\(\displaystyle{ h = \frac{b-a}{n}}\)
\(\displaystyle{ y_{i} = f(xi)}\)
\(\displaystyle{ f(xi) = \frac{1}{ 1 + x(i)^{2} }}\)

Dane do zadania:
\(\displaystyle{ \alpha = 0.5}\)
\(\displaystyle{ \beta = -0.5}\)
\(\displaystyle{ a = -1}\)
\(\displaystyle{ b = 1}\)
\(\displaystyle{ n = 10}\)
\(\displaystyle{ s'(a)=\alpha,\quad s'(b)= \beta}\)
czy dokładnie takie było zadanie, czy też było coś więcej albo mniej?
(a książka już mi się ciągnie..., ) na usprawiedliwienie mogę powiedzieć, że papierową wersję miałem, ale gdzieś się rozchodowała
bolok
Użytkownik
Użytkownik
Posty: 39
Rejestracja: 13 maja 2007, o 15:18
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 14 razy

[C#] Interpolacja funkcjami sklejanymi

Post autor: bolok »

Xitami pisze:(a książka już mi się ciągnie..., ) na usprawiedliwienie mogę powiedzieć, że papierową wersję miałem, ale gdzieś się rozchodowała
Super, że chcesz do tej książki zerknąć, myślę że Ty to zrozumiesz

Dane do zadania

Dane wzory:
\(\displaystyle{ x_{i} = a + i*h ; i=0,1 ...n}\)
\(\displaystyle{ h = \frac{b-a}{n}}\)
\(\displaystyle{ y_{i} = f(xi)}\)
\(\displaystyle{ f(xi) = \frac{1}{ 1 + x(i)^{2} }}\)
\(\displaystyle{ m = \frac{x-a}{h}}\)
\(\displaystyle{ s'(a)=\alpha,\quad s'(b)= \beta}\)

Dane liczbowe:
\(\displaystyle{ \alpha = 0.5}\)
\(\displaystyle{ \beta = -0.5}\)
\(\displaystyle{ a = -1}\)
\(\displaystyle{ b = 1}\)
\(\displaystyle{ n = 10}\)

Dana macierz:


Wzór na 11 kolumne powyższej macierzy:
\(\displaystyle{ \begin{bmatrix} y_{0} + \frac{1}{3}h* \alpha \\y1 \\...\\y_{n} + \frac{1}{3}h* \beta \end{bmatrix}}\)

Na 100% nie pamiętam, ale chyba to też było dane:

\(\displaystyle{ - c _{-1} + c_{1} = \frac{h}{3} * \alpha 1}\)
\(\displaystyle{ - c _{n-1} + c_{n+1} = \frac{h}{3} * \beta 1}\)

Wzór do testowania:
\(\displaystyle{ t = \frac{x-a}{h} - m}\)
\(\displaystyle{ P= C_{m-1} *(1-t) ^{3} + C _{m} * [ (2-t) ^{3} -4(1-t) ^{3}] + C _{m+1} * [ (1+t) ^{3} -4t ^{3}] + C _{m+2}*t ^{3}}\)

Tylko ten wzór na t chyba źle przepisałem bo tak jak jest to t zawsze będzie równe 0. No ale to na razie można pominąć. Ważne żeby te węzły były dobrze liczone.
Xitami

[C#] Interpolacja funkcjami sklejanymi

Post autor: Xitami »

w "interpolacji"
co to jest W[] ? potęgi x?
bolok
Użytkownik
Użytkownik
Posty: 39
Rejestracja: 13 maja 2007, o 15:18
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 14 razy

[C#] Interpolacja funkcjami sklejanymi

Post autor: bolok »

Xitami pisze:w "interpolacji"
co to jest W[] ? potęgi x?
Tablica W to tablica FI przekazana jako parametr do funkcji interpolacja (sorky za tą plątanine nazw).

A tą tablice wypełniamy wg tego co w książce pisze, tak:

\(\displaystyle{ \Phi_i^3(x)={{1}\over{h^3}}\begin{cases}
(x-x_{i-2})^2&\mbox{ dla } x\in\langle x_{i-2}-x_{i-1}\rangle\\
h^3+3h^2(x-x_{i-1})+3h(x-x_{i-1})^2-3(x-x_{i-1})^3&\mbox{ dla }x\in\langle x_{i-1};x_i\rangle\\
h^3+3h^2(x_{i+1}-x)+3h(x_{i+1}-x)^2-3(x_{i+1}-x)^3&\mbox{ dla }x\in\langle x_i;x_{i+1}\rangle\\
(x_{i+2}-x)^3&\mbox{ dla }x\in\langle x_{i+i};x_{i+2}\rangle \\
0&\mbox{ dla pozostałych }x\in R
\end{cases}\;}\)


Tutaj jest najbardziej aktualny kod programu:

Kod: Zaznacz cały

http://wklej.org/id/634686
, choć dalej działający źle
Xitami

[C#] Interpolacja funkcjami sklejanymi

Post autor: Xitami »

Kod: Zaznacz cały

194            double[] xx = new double[n];
195            double[] y = new double[n];
196            double[] C = new double[n];
bolok
Użytkownik
Użytkownik
Posty: 39
Rejestracja: 13 maja 2007, o 15:18
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 14 razy

[C#] Interpolacja funkcjami sklejanymi

Post autor: bolok »

Xitami pisze:

Kod: Zaznacz cały

194            double[] xx = new double[n];
195            double[] y = new double[n];
196            double[] C = new double[n];
xx - tablica x-ów
y - tablica y-ów
C - rozwiązanie równania (bez tych dwóch dodatkowych ograniczeń)
Cplus2 = C + dwa dodatkowe ograniczenia

Coś w tym jest nie tak?
Xitami

[C#] Interpolacja funkcjami sklejanymi

Post autor: Xitami »

n czy n+1 ?

-- 26 listopada 2011, 16:22 --



\(\displaystyle{ j=\left\lfloor\frac{x-a}{h}\right\rfloor}\)
pozioma oś to j+..
x w którym chcemy interpolować wypada gdzieś między j+0 a j+1
nie liczymy n+3 wartości \(\displaystyle{ \phi^3_i(x)}\) niezerowe będą tylko cztery punkty
przemnożyć przez 4 odpowiednie z rozwiązania Gausem i to jest interpolacja dla konkretnego x
(patrz: końcówka tekstu - przed Ćwiczeniami)

formuły dla \(\displaystyle{ \phi_i^3}\) (F.M.W. - 1.65) ładnie się upraszczają
np. dla
\(\displaystyle{ x\in\left\langle x_{i-1};\quad{}x_{i}\right\rangle\\\\
r=\frac{x-x_i}{h}\\\\1+3r(1 + r(1 +r))}\)

uwaga: \(\displaystyle{ -1 \le i \le n+1}\), a w tablicy mamy tylko \(\displaystyle{ X_0\cdots X_n}\)
czy na pewno potrzebne są tablice X oraz Y?

mniej liczysz to mniej się zmęczysz i mniej pomylisz (zaokrąglenia)

naścibolę coś wieczorem (w PARI/GP zmieszczę się chyba na jednym ekranie, Gausa mam "wbudowanego") jak coś mi wyjdzie to może porównamy wyniki.
bolok
Użytkownik
Użytkownik
Posty: 39
Rejestracja: 13 maja 2007, o 15:18
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 14 razy

[C#] Interpolacja funkcjami sklejanymi

Post autor: bolok »

Dzięki wielkie.

Kod: Zaznacz cały

czy na pewno potrzebne są tablice X oraz Y?
Właśnie się dowiedziałem że tablica X-ów nie jest potrzebna, a Y tak bo to ostatnia kolumna macierzy. Zaraz spróbuje poprawić swój kod.
ODPOWIEDZ