In un file di nome Funzione.java creato con il blocco note, inserire il seguente commento (facoltativo):
/**
* questa classe descrive la funzione periodica
di cui si vuole calcolare lo spettro.
*/
public
se la classe viene salvata in un file
di nome Funzione.java
e non ci sono altre dichiarazioni di classi all'interno dello stesso file.
public class Funzione
{
La classe contiene le proprietà Periodo, Frequenza e velocità angolare della funzione periodica.
Questi campi sono accessibili solo tramite i metodi della classe, quindi la loro regione di visibilità
viene resa private
:
private double Periodo, Frequenza, Omega;
La classe deve possedere un costruttore che inizializza i campi membro (o proprietà)
della classe, nel momento in cui si crea un'istanza della classe.
Il costruttore riceve come parametro il valore del periodo nella variabile T di tipo double
e calcola la frequenza e la velocità angolare.
/** Costruttore di oggetti di classe Funzione */
public Funzione(double T) {
Periodo = T;
Frequenza = 1/T;
Omega = 2*Math.PI/T;
}
La funzione seguente contiene l'espressione matematica che restituisce un valore di tipo double in corrispondenza ad un determinato istante di tempo ricevuto come parametro:
/**
* espressione della funzione:
* parametro ricevuto: tempo;
* parametro restituito: valore della funzione al tempo t.
*/
public double f(double t) {
/**
* calcola il valore della funzione in un istante t
* contenuto all'interno di un periodo dell'onda quadra
*/
Anche in questo caso è opportuno inserire dei commenti.
Se il tempo t è maggiore del periodo, si calcolano quante onde sono già passate
dividendo il tempo t per il periodo, e poi sottraendo t dalla durata di queste onde.
int NrPer;
if (t>Periodo) {
NrPer = (int) (t/Periodo);
t = t - (double) (NrPer*Periodo);
}
if (t<=Periodo/2) return -10.0;
else return 10.0;
} // fine metodo f.
/**
accesso ai campi membro della classe
*/
public double w(){
return Omega;
} // fine metodo w
} // fine classe Funzione
/**
* Applicazione del teorema di Fourier ad una funzione
* periodica definita nella classe Funzione.
* Calcola i coefficienti e poi somma le prime
* tre armoniche in un periodo.
*/
public class Armoniche {
// i coefficienti delle armoniche
private double A0, A[], B[];
private double M[], fi[], T, dt, dwt;
private Funzione F;
/**
* Costruttore di oggetti di classe Fourier
* crea un oggetto Funzione e calcola il passo di
* integrazione dt.
*/
public Armoniche(double Periodo) {
T = Periodo;
F = new Funzione(T);
dt = T/100;
dwt=F.w()*dt;
A = new double[3];
B = new double[3];
M = new double[3];
fi= new double[3];
for (int i=0; i<3; i++) {
A[i] = Integrale(i+1, true);
B[i] = Integrale(i+1, false);
}
A0=Media();
M[0]=Math.sqrt(A[0]*A[0]+B[0]*B[0]);
fi[0]=Math.atan(A[0]/B[0]);
M[1]=Math.sqrt(A[1]*A[1]+B[1]*B[1]);
fi[1]=Math.atan(A[1]/B[1]);
M[2]=Math.sqrt(A[2]*A[2]+B[2]*B[2]);
fi[2]=Math.atan(A[2]/B[2]);
}
private double Media() {
double t, somma;
somma = 0.0;
for (double alfa=0.0; alfa < F.w()*T; alfa += dwt) {
t=alfa/F.w();
somma += F.f(t)*dwt;
}
somma/=(2*Math.PI);
return somma;
}
private double Integrale(int k, boolean AoB){
double t, somma;
somma = 0.0;
for (double alfa=0.0; alfa < F.w()*T; alfa += dwt) {
t=alfa/F.w();
if (AoB) somma += F.f(t)*Math.cos(k*F.w()*t)*dwt;
else somma += F.f(t)*Math.sin(k*F.w()*t)*dwt;
}
somma /= Math.PI;
return somma;
}
public double Coefficienti(int k) {
return M[k];
}
public double a0() {
return A0;
}
} // fine classe Armoniche
import java.awt.*;
import java.awt.event.*;
public class GestoreFinestra implements WindowListener {
public void windowIconified(WindowEvent e){};
public void windowDeiconified(WindowEvent e){};
public void windowDeactivated(WindowEvent e){};
public void windowActivated(WindowEvent e){};
public void windowOpened(WindowEvent e){};
public void windowClosed(WindowEvent e){};
public void windowClosing(WindowEvent e) {
System.exit(0);
} // fine window closing
} // fine classe Gestore Finestra
public class Diagramma extends Canvas {
public void paint(Graphics g) {
int QuotaYAscisse,
DistanzaOrdinateOr,
DistanzaOrdinateTr,
X, Y, p, YPrec, gradi, somma;
double alfa, scalaX, scalaY, t;
Armoniche C = new Armoniche(20.0);
Funzione G = new Funzione(20.0);
scalaX=300.0/(Math.PI*2);
scalaY=200.0/25.0;
QuotaYAscisse=150;
DistanzaOrdinateTr=150;
DistanzaOrdinateOr=200;
g.setColor(Color.red);
g.drawLine(0,QuotaYAscisse,400,QuotaYAscisse);
g.drawLine(DistanzaOrdinateTr, 240,DistanzaOrdinateTr,0);
for (alfa=0.0; alfa <= 2*Math.PI; alfa+=Math.PI/100.0){
X = (int) (scalaX*alfa);
t=alfa/G.w();
Y = QuotaYAscisse - (int) (G.f(t)*scalaY);
g.setColor(Color.green);
g.drawLine(X,Y,X,Y); // Punto in posizione alfa, f(wt)
g.setColor(Color.orange);
Y = (int) (scalaY*C.a0()); // il valore costante
g.drawLine(X,Y,X,Y);
somma = Y;
Y = (int) (scalaY*C.Coefficienti(0)*Math.sin(G.w()*t));
somma += Y;
Y += QuotaYAscisse;
g.drawLine(X,Y,X,Y);
Y = (int) (scalaY*C.Coefficienti(1)*Math.sin(2.0*G.w()*t));
somma += Y;
Y += QuotaYAscisse;
g.drawLine(X,Y,X,Y);
Y= (int) (scalaY*C.Coefficienti(2)*Math.sin(3.0*G.w()*t));
somma += Y;
Y += QuotaYAscisse;
g.drawLine(X,Y,X,Y);
somma += QuotaYAscisse;
g.setColor(Color.magenta);
g.drawLine(X,somma,X,somma);
} // fine ciclo for
} // fine metodo paint
} // fine classe
public class Fourier {
public static void main(String argv[]) {
Frame Finestra = new Frame("Analisi di Fourier");
Diagramma Grafico = new Diagramma();
Finestra.addWindowListener(new GestoreFinestra());
Finestra.setSize(500,400);
Finestra.setLocation(100,100);
Finestra.setResizable(false);
Finestra.add(Grafico); // si aggiunge l’oggetto grafico
Finestra.setVisible(true);
}
}