Obliczanie całki i pochodnej

0

Witam. Mam do zrobienia mały program, który oblicza całkę i pochodną dla tego samego przedziału (x0,xn). Muszę zrobić okienko, które będzie zawierało 3 pola do wpisywania przez użytkownika obszar całkowania x0 i xn oraz trzecie dla ilości prostokątów( całka obliczana metodą prostokątów) i 2 pola wypisujące wynik całki i wynik pochodnej. Na końcu przycisk Oblicz. Okienko prowizorycznie zrobione:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Sinus implements ActionListener{
	
    public static Sinus program;
    private JFrame          okno;
    private JButton         przycisk;
    private JTextField      text1;
    private JTextField      text2;
    private JTextField      text3;
    private JTextField      wynik1;
    private JTextField      wynik2;
    
    
    public Sinus( String nazwaOkna ){
        okno  = new JFrame( nazwaOkna );
        text1 = new JTextField( "Wprowadz poczatek przedzialu x0" );
        text2 = new JTextField( "Wprowadz koniec przedzialu xn" );
        text3 = new JTextField( "Wprowadź liczbe prostokatow");
        wynik1 = new JTextField( "Wynik pochodnej" );
        wynik2 = new JTextField( "Wynik calki");
        przycisk = new JButton( "Oblicz" );
        
       
        GridLayout layout = new GridLayout(4,3);
        layout.setVgap( 25 );
        okno.setLayout( layout  );
        okno.add( text1 );
        okno.add( text2 );
        okno.add( text3 );
        okno.add( wynik1 );
        okno.add( wynik2 );
        okno.add( przycisk );
        przycisk.addActionListener( this );
                
        okno.setSize( 700, 250 );
        okno.setVisible(true);
    }
    
	public static void main(String[] args) {
        program = new Sinus( "Obliczanie pochodnej i calki" );
	}

}

Program obliczający całkę również:

public class Metoda_prostokatow {

	//funkcja dla ktorej obliczamy calke
	private static double func(double x) {
		return x*x+3;
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		double x0, xn, dx, calka;
		int n;
		
		System.out.println("Podaj poczatek przedzialu calkowania");
		x0 = Console.readDouble("");
		
		System.out.println("Podaj koniec przedzialu calkowania");
		xn = Console.readDouble("");

		System.out.println("Podaj dokladnosc calkowania");
		n = Console.readInt("");

		dx = (x0 - xn) / (double)n;
		
		calka = 0;
		for (int i=1; i<=n; i++) {
			calka += func(x0 + i * dx);
		}
		calka *= dx;
		
		System.out.println("Wartosc całki wynosi w przyblizeniu " + calka);

	}

}

Nie wiem jak napisać program obliczający pochodną oraz jak to wszystko połączyć w całość. Liczę na fachową pomoc, gdyż nigdy wcześniej nie miałam do czynienia z programowaniem ;-)

0

Hmm... moze inaczej. Czy musisz napisac dwa oddzielne programy ? Bo z reguly pisze sie jeden program, ktory posiada okreslona funkcjonalnosc i ewentualnie dodatkowo interfejs graficzny do jego obslugi.

P.S.
Dodaj w oknie metode obslugi zdarzenia (actionPerformed) i w niej oblicz calke, algorytmem, ktory podalas, a nastepnie wyswietl wynik w odpowiednij kontrolce.

0

To nie są dwa oddzielne programy. Po prostu napisałam jak oblicza się całkę, ale nie wiem jak ją umieścić w programie oraz jak napisać algorytm na obliczanie pochodnej??
Wiem, że trzeba przed public Sinus wstawić to:

public void actionPerformed(ActionEvent e)
......
}

Tylko jak umieścić w miejsce kropeczek obliczanie tych funkcji[???]

0

Nie "przed public Sinus", tylko gdziekolwiek w klasie Sinus ;> To jest zwykla jej metoda (metoda = funkcja klasy).

public void actionPerformed(ActionEvent e)
                double x0, xn, dx, calka;
                int n;
                // tu pobierz z odpowiedniego pola wartosc x0
                x0 = ...
               
                // tu analogicznie zrob z xn
                xn = ...

                // oraz z n
                n = ...

                dx = (x0 - xn) / (double)n;
               
                calka = 0;
                for (int i=1; i<=n; i++) {
                        calka += func(x0 + i * dx);
                }
                calka *= dx;

               // a teraz wartosc zmiennej calka sprobuj przypisac jako wartosc np jakiegos pola edycyjnego,
               // czy gdzie tam masz wyswietlic wynik
}

Aha, no i oczywiscie musisz do klasy Sinus (czemu ona sie tak nazywa ? ;p) wkleic funkcje "func", zeby bylo wiadomo, co liczyc ;>

0

Ok. Wstawiłamw public sinus:

private static double func(double x) {
                return x*x+3;
        }

A kod od Ciebie kropeczki tak uzupełniłam:

   
      x0 = text1.getText();
      xn = text2.getText();
      n = text3.getText();

Jednak. wyświetla mi się, że jest błąd, gdyż text1,text2, text3 są zadeklarowane w public class sinus jako typ String, a tutaj double

0
      x0 = Double.parseDouble(text1.getText());
      .....

Możesz (powinnaś) się też zabezpieczyć przed nieprawidłowym wpisem

      try
      {
          x0 = Double.parseDouble(text1.getText());
      }
      catch(Exception e)
      {
           text1.selectAll();
           text1.requestFocus();
           return; 
      }
      .....
0

Ok. Na razie mój kod wygląda następująco:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;


public class Sinus implements ActionListener{
	
    public static Sinus program;
    private JFrame          okno;
    private JButton         przycisk;
    private JTextField      text1;
    private JTextField      text2;
    private JTextField      text3;
    private JTextField      wynik;
   
   
    private static double func(double x) {
        return x*x+3;
} 
    
    public Sinus( String nazwaOkna ){
        okno  = new JFrame( nazwaOkna );
        text1 = new JTextField( "Wprowadz poczatek przedzialu x0" );
        text2 = new JTextField( "Wprowadz koniec przedzialu xn" );
        text3 = new JTextField( "Wprowadź liczbe prostokatow");
        wynik = new JTextField( "Wynik" );
        przycisk = new JButton( "Oblicz" );
           	
    
        GridLayout layout = new GridLayout(4,1);
        layout.setVgap( 25 );
        okno.setLayout( layout  );
        okno.add( text1 );
        okno.add( text2 );
        okno.add( text3 );
        okno.add( wynik );
        okno.add( przycisk );
        przycisk.addActionListener( this );
                
        okno.setSize( 500, 250 );
        okno.setVisible(true);
    }
    public void actionPerformed(ActionEvent e){
    double x0, xn, dx, calka;
    int n;
   
    x0 = Double.parseDouble(text1.getText());
    xn = Double.parseDouble(text2.getText());
    n  = Integer.parseInt(text3.getText());

    dx = (x0 - xn) / (double)n;
   
    calka = 0;
    for (int i=1; i<=n; i++) {
            calka += func(x0 + i * dx);
    }
    calka *= dx;
    
    
        wynik.setText( "Calka wynosi:" +calka );
    }
   
           
    
	public static void main(String[] args) {
        program = new Sinus( "Obliczanie pochodnej i calki" );
	}

}


Gdzie mam wstawić blok try and catch(w którym miejscu) ?? Czy fragment kodu:
wynik.setText( "Calka wynosi:" +calka ); jest poprawny??

0
  1. Zamiast
x0 = Double.parseDouble(text1.getText());

daj

try
{
    x0 = Double.parseDouble(text1.getText());
}
catch(Exception e)
{
    .....
}
  1. Prawie dobrze
   wynik.setText( "Całka wynosi: " +calka );
0

Ok, ale jak w tym fragmencie kodu:

public void actionPerformed(ActionEvent e){
    double x0, xn, dx, calka;
    int n;
   
    x0 = Double.parseDouble(text1.getText());
    xn = Double.parseDouble(text2.getText());
    n  = Integer.parseInt(text3.getText());

    dx = (x0 - xn) / (double)n;
   
    calka = 0;
    for (int i=1; i<=n; i++) {
            calka += func(x0 + i * dx);
    }
    calka *= dx;
    
    
        wynik.setText( "Calka wynosi:" +calka );
    }

Wprowadzę zmiany, o których wspomniałeś:

public void actionPerformed(ActionEvent e){
    double x0, xn, dx, calka;
    int n;
   try 
{
    x0 = Double.parseDouble(text1.getText());
}
catch(Exception e)
{
...}
    xn = Double.parseDouble(text2.getText());
    n  = Integer.parseInt(text3.getText());

    dx = (x0 - xn) / (double)n;
   
    calka = 0;
    for (int i=1; i<=n; i++) {
            calka += func(x0 + i * dx);
    }
    calka *= dx;
    
    
        wynik.setText( "Calka wynosi:" +calka );
    }

będzie duplicate e

0

zamiast e napisz exception ;|

Btw Material na informatyke w Gimnazjum ? Calki to calkiem ostro ^^

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