Na ćwiczeniach miałem zadanie żeby zrobić aplikację która umożliwia oszacowanie szukanej wartości przez symulację doświadczenia losowego, z ilustracją graficzną wyników doświadczenia. Zadanie wykonane jest dla całki oznaczonej x^2 * sin(x) w przedziale od 0 do 2.
Oryginalna treść znajduje się tu pkt I i II
http://www.it.pw.edu.pl/~mse/Ins2s3_13.pdf
Gotowy kod to:
`
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.util.Random;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
public class Całka extends javax.swing.JFrame {
long ldoświadczeń, lsukcesów;
int lp = 1000;
final double W = 2.469;
double wynik = 0;
Random r = new Random();
Image obraz;
Graphics bufor;
PanelGraficzny panel = new PanelGraficzny();
public Całka() {
initComponents();
add(panel);
obraz = createImage(panel.getWidth(), panel.getHeight());
bufor = obraz.getGraphics();
stanPoczątkowy(null);
jTable1.setValueAt(W, 0, 3);}
class PanelGraficzny extends JPanel {
public PanelGraficzny() {
setBounds(20, 20, 200, 200);
setBorder(BorderFactory.createLineBorder(Color.blue));
}
public void paintComponent(Graphics g) {
g.drawImage(obraz, 0, 0, null);
}
}
private void ilustracjaDoświadczenia() {
double x = 2 * r.nextDouble();
double y = 4 * r.nextDouble();
if (y <= x * x * Math.sin(x)) {
lsukcesów++;
bufor.setColor(Color.red);
} else {
bufor.setColor(Color.yellow);
}
int xp = (int) (x / 2 * panel.getWidth());
int yp = panel.getHeight() - (int) (y / 4 * panel.getHeight());
bufor.drawLine(xp, yp, xp, yp);
wynik = 8.0 * lsukcesów / ldoświadczeń;
}
private void seriaLosowań(java.awt.event.ActionEvent evt) {
for (int i = 0; i < lp; i++) {
ldoświadczeń++;
ilustracjaDoświadczenia();
}
jTable1.setValueAt(ldoświadczeń, 0, 0);
jTable1.setValueAt(lsukcesów, 0, 1);
jTable1.setValueAt(wynik, 0, 2);
panel.repaint();
}
private void stanPoczątkowy(java.awt.event.ActionEvent evt) {
ldoświadczeń = lsukcesów = 0;
jTable1.setValueAt(0, 0, 0);
jTable1.setValueAt(0, 0, 1);
jTable1.setValueAt(null, 0, 2);
bufor.setColor(Color.white);
bufor.fillRect(0, 0, panel.getWidth(), panel.getHeight());
panel.repaint();
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Symulacja().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JTable jTable1;
private javax.swing.JTextArea jTextArea1;
// End of variables declaration
}`
Kod do ilustrowania całki
Kod:
private void ilustracjaDoświadczenia() {
double x = 2 * r.nextDouble();
double y = 4 * r.nextDouble();
if (y <= x * x * Math.sin(x)) {
lsukcesów++;
bufor.setColor(Color.red);
} else {
bufor.setColor(Color.yellow);
}
int xp = (int) (x / 2 * panel.getWidth());
int yp = panel.getHeight() - (int) (y / 4 * panel.getHeight());
bufor.drawLine(xp, yp, xp, yp);
wynik = 8.0 * lsukcesów / ldoświadczeń;
Pytanie moje brzmi następująco co muszę zmienić jeśli chciałbym zmienić granice całkowania np. od -2 do -1 ?
Jeszcze mam podaną stałą W=2.469 i jak bym ją chciał zmienić to musi być zapisana w postaci dziesiętnej? Bo jak chcę zapisać w postaci ułamka to po uruchomieniu w tabelce wyświetla mi wynik = 0. Ewentualnie gdybym miał liczbę W= pi ^3 -6pi lub 10-8e
Dodatkowo jaką instrukcje należało by dodać żeby liczba losowań "lp" była zależna od komponentu jSlider?