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);
}
}
|
