
Sistema de ecuaciones lineales
Véase Matrices y vectores y Resolución de ecuaciones
public class Vector { public int n; //dimensión public double[] x; public Vector(int n) { this.n=n; x=new double[n]; for(int i=0; i<n; i++){ x[i]=0.0; } } public Vector(double[] x) { this.x=x; n=x.length; } } public class Matriz implements Cloneable{ public int n; //dimensión public double[][] x; public Matriz(int n) { this.n=n; x=new double[n][n]; for(int i=0; i<n; i++){ for(int j=0; j<n; j++){ x[i][j]=0.0; } } } public Matriz(double[][] x) { this.x=x; n=x.length; } public Object clone(){ Matriz obj=null; try{ obj=(Matriz)super.clone(); }catch(CloneNotSupportedException ex){ System.out.println(" no se puede duplicar"); } obj.x=(double[][])obj.x.clone(); for(int i=0; i<obj.x.length; i++){ obj.x[i]=(double[])obj.x[i].clone(); } return obj; } //producto de una matriz por un vector columna (nxn) (nx1)= (nx1) static Vector producto(Matriz a, Vector v){ int n=v.n; //dimensión Vector b=new Vector(n); for(int i=0; i<n; i++){ for(int k=0; k<n; k++){ b.x[i]+=a.x[i][k]*v.x[k]; } } return b; } //matriz inversa static Matriz inversa(Matriz d){ int n=d.n; //dimensión de la matriz Matriz a=(Matriz)d.clone(); Matriz b=new Matriz(n); //matriz de los términos independientes Matriz c=new Matriz(n); //matriz de las incógnitas //matriz unidad for(int i=0; i<n; i++){ b.x[i][i]=1.0; } //transformación de la matriz y de los términos independientes for(int k=0; k<n-1; k++){ for(int i=k+1; i<n; i++){ //términos independientes for(int s=0; s<n; s++){ b.x[i][s]-=a.x[i][k]*b.x[k][s]/a.x[k][k]; } //elementos de la matriz for(int j=k+1; j<n; j++){ a.x[i][j]-=a.x[i][k]*a.x[k][j]/a.x[k][k]; } } } //cálculo de las incógnitas, elementos de la matriz inversa for(int s=0; s<n; s++){ c.x[n-1][s]=b.x[n-1][s]/a.x[n-1][n-1]; for(int i=n-2; i>=0; i--){ c.x[i][s]=b.x[i][s]/a.x[i][i]; for(int k=n-1; k>i; k--){ c.x[i][s]-=a.x[i][k]*c.x[k][s]/a.x[i][i]; } } } return c; } } class Colision { public static void main(String[] args) { //datos double ang=0*Math.PI/180; double mu=0.1; double e=0.94; double u1=3.5; double M=0.5; double k=0.5; //discos //incógnitas double v1; double v2; double w1; double w2; double fi1; double fi2; double Q; if(ang==0){ //choques frontales v1=(M-e)*u1/(1+M); v2=M*(1+e)*u1/(1+M); fi1=.0; fi2=0.0; w1=0.0; w2=0.0; }else{ //choques oblicuos double[][] matriz={ {Math.sin(ang), Math.cos(ang), -Math.sin(ang), -Math.cos(ang), 1.0, 1.0}, {0.0, M, 0.0, 1.0, 0.0, 0.0}, {M, 0.0, 1.0, 0.0, 0.0, 0.0}, {-Math.cos(ang), Math.sin(ang), Math.cos(ang), -Math.sin(ang),0.0, 0.0}, {Math.sin(ang), Math.cos(ang), 0.0, 0.0, -k, 0.0}, {0.0, 0.0, Math.sin(ang), Math.cos(ang), 0.0, k} }; Matriz coef=new Matriz(matriz); double[] vector={ 0.0, 0.0, (M*u1), (e*u1*Math.cos(ang)), (u1*Math.sin(ang)), 0.0 }; Vector ter=new Vector(vector); Vector solucion=Matriz.producto(Matriz.inversa(coef), ter); System.out.println("No desliza "); //desliza o no desliza? double V1x=solucion.x[0]; double V1y=solucion.x[1]; double V2x=solucion.x[2]; double V2y=solucion.x[3]; w1=solucion.x[4]; w2=solucion.x[5]; double A=mu*(V1y*Math.sin(ang)-(V1x-u1)*Math.cos(ang)); double B=u1*Math.sin(ang)-V1x*Math.sin(ang)-V1y*Math.cos(ang); if(A<B){ //desliza coef.x[0][0]=Math.sin(ang)-mu*Math.cos(ang); coef.x[0][1]=Math.cos(ang)+mu*Math.sin(ang); coef.x[0][2]=0.0; coef.x[0][3]=0.0; coef.x[0][4]=0.0; coef.x[0][5]=0.0; ter.x[0]=-mu*u1*Math.cos(ang)+u1*Math.sin(ang); solucion=Matriz.producto(Matriz.inversa(coef), ter); V1x=solucion.x[0]; V1y=solucion.x[1]; V2x=solucion.x[2]; V2y=solucion.x[3]; w1=solucion.x[4]; w2=solucion.x[5]; double comprobar=V2y*Math.cos(ang)+V2x*Math.sin(ang)- mu*(-V2y*Math.sin(ang)+V2x*Math.cos(ang)); System.out.println("desliza - comprobar"+comprobar); } v1=Math.sqrt(V1x*V1x+V1y*V1y); fi1=Math.atan2(V1y,V1x); v2=Math.sqrt(V2x*V2x+V2y*V2y); fi2=Math.atan2(V2y,V2x); } //energía perdida en la colisión Q=M*v1*v1/2+M*k*w1*w1/2+v2*v2/2+k*w2*w2/2-M*u1*u1/2; //imprime los resultados System.out.println("primera partícula: v. c.m. "+v1+" dirección "+ (180*fi1/Math.PI)+" v. angular "+w1); System.out.println("segunda partícula: v. c.m. "+v2+" dirección "+ (180*fi2/Math.PI)+" v. angular "+w2); System.out.println("energía perdida en la colisión "+Q); } } |
