¿Alguna vez te has preguntado que es un seno? o un coseno o todas esas funciones similares que nos dan dolor de cabeza en algunas materias. Si eres de los que se lo han preguntado sigue leyendo, de lo contrario este post no es para ti.
Bien no vamos a definir que es un seno o como funciona el punto que me interesa es explicar el código Java o para cualquier otra “lengua” en que se requiera para calcular un seno.
Ejemplo: Si tenemos una calculadora de esas comunes que usamos en la escuela y pulsamos la tecla sin 5, seguramente nos arrojara un resultado como -0.95892427466313846889315440615599… configurada en radianes(insisto en que si no sabes que es un radian cambiate de página o continua tu camino). El asunto de esto es elaborar un programa que nos arroje ese mismo resultado usando una serie(una de las series de Taylor para ser mas especificos) la serie es la siguiente:

Esta serie es valida para cualquier valor. Y cabe mencionar que entre mas veces se repita el resultado es mas exacto, el error disminuye.
El proyecto fué desarrollado en Netbeans para facilitar la parte gráfica, el desarrollo debe ser pensado y programado por uno mismo. A continuación una captura usando el seno de 5 como ejemplo.
Donde Es representa el indice de error o el error minimo con el que se pretende dar el resultado.
X es el número al que se le desea calcular el seno.
Las tres columnas muestran los resultados expresados en radianes, la columna del error debe ir disminuyendo hasta que el error sea menor a Es.
Y el resultado real se muestra obviamente en la columna de en medio.
El código a continuación:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/*
* Serie5.java
*
* Created on 2/09/2009, 11:37:53 PM
*/
import javax.swing.*;
/**
*
* @author luis
*/
public class Serie5 extends javax.swing.JFrame {
public double x;
public double Es;
/** Creates new form Serie5 */
public Serie5() {
initComponents();
areaR.setText(null);
areaR.setText("Término\tResultado(Radianes)\t\t\tError");
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
lblEs = new javax.swing.JLabel();
txtEs = new javax.swing.JTextField();
lblX = new javax.swing.JLabel();
txtX = new javax.swing.JTextField();
txtResolver = new javax.swing.JButton();
jScrollPane1 = new javax.swing.JScrollPane();
areaR = new javax.swing.JTextArea();
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
jLabel3 = new javax.swing.JLabel();
jButton1 = new javax.swing.JButton();
jLabel4 = new javax.swing.JLabel();
jLabel5 = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("Series");
lblEs.setText(“Es=”);
txtEs.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
txtEsActionPerformed(evt);
}
});
lblX.setText("x=");
txtResolver.setText("Resolver");
txtResolver.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
txtResolverActionPerformed(evt);
}
});
areaR.setColumns(20);
areaR.setEditable(false);
areaR.setRows(5);
jScrollPane1.setViewportView(areaR);
jLabel1.setText("%");
jLabel2.setText(“Serie valida para”);
jLabel3.setText(“-infinito<x<infinito”);
jButton1.setText(“Nuevos datos”);
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
jLabel5.setIcon(new javax.swing.ImageIcon(getClass().getResource("/last.gif"))); // NOI18N
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 980, Short.MAX_VALUE)
.addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
.addComponent(jLabel4)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel5)
.addGap(41, 41, 41)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addGroup(layout.createSequentialGroup()
.addComponent(lblX)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(txtX))
.addGroup(layout.createSequentialGroup()
.addComponent(lblEs)
.addGap(1, 1, 1)
.addComponent(txtEs, javax.swing.GroupLayout.PREFERRED_SIZE, 138, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 572, Short.MAX_VALUE))
.addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
.addGap(145, 145, 145)
.addComponent(txtResolver, javax.swing.GroupLayout.PREFERRED_SIZE, 207, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 162, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(58, 58, 58)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabel3)
.addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, 402, Short.MAX_VALUE))))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, 93, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(56, 56, 56)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(lblEs)
.addComponent(txtEs, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel1))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(lblX)
.addComponent(txtX, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addComponent(jLabel5))
.addGap(24, 24, 24)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(txtResolver)
.addComponent(jButton1)
.addComponent(jLabel2))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel3)))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 381, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
);
pack();
}// </editor-fold>//GEN-END:initComponents
private void txtEsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txtEsActionPerformed
// TODO add your handling code here:
}//GEN-LAST:event_txtEsActionPerformed
private void txtResolverActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txtResolverActionPerformed
// TODO add your handling code here:
//Primero validamos la función
try{
x=Double.parseDouble(txtX.getText());
Es=Double.parseDouble(txtEs.getText());
areaR.setText(null);
areaR.setText(“Término\tResultado(Radianes)\t\t\tError”);
areaR.setText(areaR.getText() + “\n1\t1\t\t\t\t0\n”);
double [][]er=new double[3][10000];
er[0][1]=1;
er[1][1]=x;
er[2][1]=0;
int l1=40;
int l2=40;
String cad1=”";
String cad2=”";
double n=0;
int k=2;
int exponente=3;
do{
cad1=”";
cad2=”";
areaR.setText(areaR.getText() + k + “\t”);
if (k%2==0){
er[1][k]=er[1][k-1] – (Math.pow(x, exponente)/factorial(exponente));
}
else{
er[1][k]=er[1][k-1] + (Math.pow(x, exponente)/factorial(exponente));
}
cad1=cad1 + er[1][k];
l1=40-cad1.length();
for (int i=0; i<l1; i++) cad1 = cad1 + “ “;
areaR.setText(areaR.getText() + cad1);
er[2][k]= Math.abs((er[1][k] – er[1][k-1])/er[1][k]*100);
areaR.setText(areaR.getText() + er[2][k] + “\n”);
k++;
exponente+=2;
}
while (er[2][k-1]>=Es);
}
catch(NumberFormatException e){
JOptionPane.showMessageDialog(null, “Formato de número inválido\npor favor verifique.”, “Error”,JOptionPane.ERROR_MESSAGE);
}
}
public double factorial(int n){
double f=1;
for (int i=n; i>=1; i--){
f*=i;
}
return f;
}//GEN-LAST:event_txtResolverActionPerformed
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
// TODO add your handling code here:
txtX.setText(null);
txtEs.setText(null);
areaR.setText(null);
areaR.setText(“Término\tResultado(Radianes)\t\t\tError”);
}//GEN-LAST:event_jButton1ActionPerformed
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Serie5().setVisible(true);
}
});
}
// Variables declaration - do not modify//GEN-BEGIN:variables
public javax.swing.JTextArea areaR;
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JLabel lblEs;
private javax.swing.JLabel lblX;
public javax.swing.JTextField txtEs;
public javax.swing.JButton txtResolver;
public javax.swing.JTextField txtX;
// End of variables declaration//GEN-END:variables
}
No he logrado acomodar el código para ser mas legible,…ustedes disculparan.
Y en resumen : Se hace un ciclo hasta que el error encontrado sea menor al error dado por el usuario. He usado un arreglo espantoso para ir almacenando los resultados. El código tiene seguramente muchas mejoras.
Saludos. Si alguien gusta el compilado (.jar) o el proyecto en netbeans completo solo comenten
Archivado bajo: General
se ve bueno tocaria conpilar para ver el resultado
Seguramente va faltar una imagen, pero si conoces un poquito seguramente la agregaras donde es necesaria…o si la necesitas solo dilo