Jak to zrobic?? - interpolacja

Odpowiedz Nowy wątek
Ziółas
2006-04-23 21:23
Ziółas
0

Witam, jestem bardzo początkujący, więc prosze o wyrozumiałość ;)
Mam taki problem, musze napisac program ,który wylicza interpolacje w zależności od zadanych węzłów czyli punktów. Zmienne chce wczytać do tablic. Oto kod:

import java.io.*;
 import java.awt.*;
 import java.util.*;
 import java.lang.String;

public class Licz {

   public float L=0;
   public float IL;
   float x; // stała zmienna x

    public Licz() throws Exception{

       BufferedReader in  = new BufferedReader(new InputStreamReader(System.in));

        //podaj liczbe wezlow z zakresu 1-15
        System.out.println("Podaj liczbe wezlow: ");
        String nr = in.readLine();
        int n = Integer.parseInt(nr);

        float[] iks=new float[n]; // tablica x-ów
        float[] y=new float[n]; // tablica y-ów

        if((n>=1) && (n<=15)){

            for(int i=0; i<=n-1; i++){

                System.out.println("Podaj x"+(i+1)+": ");
                String xp = in.readLine();
                float xx = Float.parseFloat(xp);
                iks[i] = xx;

                System.out.println("Podaj y"+(i+1)+": ");
                String yp = in.readLine();
                float yy = Float.parseFloat(yp);
                y[i] = yy;

            }
            //wzor Lagrange'a
            for(int k=0; k<=n; k++){
                 IL=1;

                 for(int i=0; i<=n; i++){
                    if (i!=k){              
                       IL = IL * ((x - iks[i]) / (iks[k]-iks[i]))*y[k];
                       System.out.println("IL= "+IL);

                    }
                 }
                L=L+IL;
                System.out.println("L= "+L);

            }

       }
      }  
    }  

Przy wypisywaniu wyników wypisuje IL ale nie wypisuje L. Prosiłbym o pomoc i ogólnie zerkniecie czy program jest dobry. Pozdrawiam :)

Pozostało 580 znaków

2006-04-24 00:39

Rejestracja: 14 lat temu

Ostatnio: 8 lat temu

0

Na pierwszy rzut oka wygląda, że dwie ostatnie pętle wykonują się o 1 cykl za dużo. Powinno być:

for(int i=0; i<n; i++)

Pozostało 580 znaków

2006-04-24 11:32

Rejestracja: 13 lat temu

Ostatnio: 13 lat temu

0

zamiast Largange'a proponowalbym Newtona (ilorazy roznicowe)

Pozostało 580 znaków

Ziółas
2006-05-01 20:29
Ziółas
0

Cykle się zgadzają przynajmniej tak to wygląda ,gdy program liczy.
Co do drugiego postu, to musi być Lagrange'a, robie to na zaliczenie.
Co do programu, wypisuje mi L ale jeśli użyje break a to raczej błąd.
Jestem w kropce. :/

Pozostało 580 znaków

2006-05-01 23:03

Rejestracja: 13 lat temu

Ostatnio: 8 lat temu

0

Sama f-cja licząca, x'y i y'ki pobierasz jak tam juz chcesz i potem wywołujsz f-cje dla szukanego x'a a w odpowiedzi dostajesz interpolowana wartosc y'ka w tym p-cie.

//  f-cja liczaca wartosc w danym p-cie,
//f-cja tworzona jest na podstawie wpisanych do ArrayList danych x'ów i odpowiadającym im y'ów

double policzWartosc(double iks){ //iks podajesz jako arg. przy wywolaniu funkcji
      double suma, licznik, mianownik;    
      suma=0;

      for (int i=0; i<tablicaX.size(); i++){
        licznik=1;
        mianownik=1;

        for (int j=0; j<tablicaX.size(); j++){
          if(i!=j){

            licznik=licznik*(iks-(Double)tablicaX.get(j));
            mianownik=mianownik*((Double)tablicaX.get(i)-(Double)tablicaX.get(j));
            }
          }
        suma+=(Double)tablicaY.get(i)*licznik/mianownik;
        }
      return suma;
      }

na peno działa, sam dostałem 5 z Met.Num. za to jak chcesz to doraniesz jeszcze rysowanie wykresu do tego :-)

pzdr.


...trafiłem do źródła wiedzy bez drogowskazu...

Pozostało 580 znaków

Ziółas
2006-05-02 12:44
Ziółas
0

Dzięki Shimmi, zaraz w to zerkne. Pozwoliłem sobie do Ciebie maila napisać ;)

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0