Jak to zrobic?? - interpolacja

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 :)

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++)
0

zamiast Largange'a proponowalbym Newtona (ilorazy roznicowe)

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. :/

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.

0

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

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