Ir al contenido


Foto

ayuda con matrices


  • Por favor identifícate para responder
13 respuestas en este tema

#1 jooz

jooz

    Member

  • Miembros
  • PipPip
  • 45 mensajes

Escrito 12 abril 2013 - 08:56

hola buenas noches espero esten bien.....
por aqui yo desde hace tiempo.... esta ves con un problemita que espero me puedan orientar como en ocasiones pasadas....
resulta que me han enviado a hacer  en c++ una actividad la cual debe resolver la inversa de una matriz por el metodo de gaus...
ya logre cargar la matriz y la matriz identidad y mostrar la matriz aumentada ahora en el proceso de calculo es que no se muy bin como hacer..... hasta aqui lo que he hecho de codigo...
[cpp]
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream.h>

double matriz[3][3];
double identidad[3][3];
double matriz_temp[6][3];

////////////////////////////////////////////////////////////////////////////////
// crear matriz identidad

void m_identidad ()
{

/*generar la matriz identidad*/
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
if(i==j)
      identidad[i][j]=1;
else
identidad[i][j]=0;
}
}

}
////////////////////////////////////////////////////////////////////////////////
//caragar la matriz de 3x3

void cargar ()
{
  cout<<"Ingresa los numeros de la matriz 3x3 relacion fila columna: \n";
for(int i=0;i<3;i++)
  {
      for (int j=0;j<3;j++)
      {
        cin>>matriz[i][j];
        }
      }

clrscr();
}

////////////////////////////////////////////////////////////////////////////////
//mostrar las matrices
void mostrar ()
{
  cout<<"La matriz es: \n";
for(int i=0;i<3;i++)
  {
      for (int j=0;j<3;j++)
      {
        cout<<matriz[i][j]<<" ";
        }
        cout<<"\n";
      }

/////mostrar matriz identidad///////

cout<<"la matriz identidad es: \n";

  for(int l=0;l<3;l++)
{
for(int m=0;m<3;m++)
{

    cout<<identidad[l][m]<<" ";
      }
    cout<<"\n";
}




/////mostrar matriz aumentada///////

cout<<"la matriz aumentada es: \n";

  for(int k=0;k<3;k++)
{
for(int n=0;n<3;n++)
{
      cout<<matriz[k][n]<<" ";
      }
  cout<<"| ";
    for(int y=0;y<3;y++)
    {
    cout<<identidad[k][y]<<" ";
    }
    cout<<"\n";
}

}


////////////////////////////////////////////////////////////////////////////////
void main ()
{
cargar();
m_identidad();
mostrar();


getch();
}
[/cpp]

gracias por la ayuda prestada que estoy seguro que me prestaran....... :) (y)
  • 0

#2 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 13 abril 2013 - 11:10

ahora en el proceso de calculo es que no se muy bin como hacer


A ver... no me queda en claro cual es tu duda... ¿Es de concepto matemático? ¿O es que no sabes como llevarlo al código tus ideas?

Creo que esto te puede dar un norte.

Si es de algún tipo de tarea o trabajo puedo entender tal pedido. Ahora, si es para algo profesional hay otras vías, además de la reducción de Gauss-Jordan (no se porqué la maña de algunos de olvidarse intencionalmente de Jordan), como ser la descomposición de Cholesky o incluso se puede obtener a partir de los autovectores y valores, llamada autodescomposición de una matriz.

Es más, si va a ser únicamente para una matriz de 3x3 hay métodos directos de obtener la inversa. Esto es posible si uno desarrolla la forma analítica y aprovecha la regla de Sarrus (que dicho sea de paso ¡es facilísima de recordar y aplicarla!) para obtener el determinante.

Yo de C/C++ no te sabría dar indicaciones pero en lo que es álgebra alguna que otra mano podría dar algunos nortes.

Saludos,
  • 0

#3 jooz

jooz

    Member

  • Miembros
  • PipPip
  • 45 mensajes

Escrito 13 abril 2013 - 11:40

hola gracias por responder.... efectivamente es un trabajo de la materia de calculo, y me lo estan pidiendo por ese metodo .... inicialmente lo estoy hacindo de 3x3 para tratar de entender el poceso y luego pedir al usuario el tamaño de la matriz .... en cuanto al proceso de resolver lo tengo mas o menos claro .... lo que no se es como llevarlo al codigo..... y una cosa que tampoco se,  es como se trabaja con las fraciones y enteros en el codigo....
gracias por su ayuda......
  • 0

#4 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 13 abril 2013 - 11:50

hola gracias por responder.... efectivamente es un trabajo de la materia de calculo, y me lo estan pidiendo por ese metodo .... inicialmente lo estoy hacindo de 3x3 para tratar de entender el poceso y luego pedir al usuario el tamaño de la matriz .... en cuanto al proceso de resolver lo tengo mas o menos claro .... lo que no se es como llevarlo al codigo..... y una cosa que tampoco se,  es como se trabaja con las fraciones y enteros en el codigo....
gracias por su ayuda......

Siendo la materia de cálculo (supongo que Cálculo Numérico) me extraña que no pida entonces resolverlo por medio de descomposición o factorización LU, que es lo más habitual.
Supongo que como recién están viendo el tema han partido por lo básico.

Si dices que tienes dificultades de llevar las cosas a código sería mejor entonces que nos puntualices exactamente sobre que partes tienes tus dudas y en base a ello te vamos guiando. De otro el que hará el trabajo (y el código, en última) seremos nosotros.
Detalla tus dudas, además de lo que nos has venido mostrado sería oportuno que nos comentes que más estuviste probando y que errores te han surgido.

Por último ¿A que te refieres con lo de trabajar con fracciones y enteros? Si tu duda es como almacenar números reales tienes a disposición el tipo float y/o double. De lo que recuerdo vagamente de C, el float es de precisión a 7 decimales, mientras que Double es (ya por estándar) hasta 15 decimales.
Yo recomiendo Double.

Saludos,
  • 0

#5 jooz

jooz

    Member

  • Miembros
  • PipPip
  • 45 mensajes

Escrito 13 abril 2013 - 12:11

ok intentare ir preguntando segun las dudas... y no espero que ustedes hagan el codigo, la idea es que yo aprenda y si usteden lo hacen no aprendere y el futuro n podre hacer las cosas por conocimiento propio lo que me frustarria como futuro programador... ....
2 3 1
-1 2 3
2 3 5

lo principal es en esta matriz la cual es el ejemplo que el ha dado lo principal es
convertir el 2 en 1 el cual es conviertiendo el 2 en divisor entonces tendria que multiplicar 2 por 1/2, el resultado es 1, esta ahi bien,
pero al multiplicar por 3 me devuelve tambien un y deberia de ser 1/3.... ahi es una duda como hacer qu mi resultado sea 1/3(un tercio) espero haberme esplicado... nuevamente gracias.....
  • 0

#6 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 13 abril 2013 - 12:28

Ha ver si entiendo... ¿Entonces tu problema con los "decimales" es que en lugar de leer un 0,3333 aparezca un 1/3?

Es decir... algo a efectos de presentación y no en cuanto al tipo de datos que utilizas para almacenar los resultados.
Si es eso me parece que lo más sano sería que lo dejes como está, que ya es complicar más las cosas. Ahora si tu deseas seguirle y convertir el número en fracción hay que considerar algunas cosas: si el número decimal es finito, periódico, etc. A ver si esto te refresca algunas cosas  ;)

Lo que deberás hacer es guardar en dos variables separadas el denominador y el numerador. Luego al momento de mostrar simplemente te aseguras de que se muestre numerador/denominador.

Es eso o no entendí tu duda  :(
Respecto al proceso no has dado alguna pista de tu dudas  ^o|
No seas tan esquivo. Se lo más descriptivo y detallista posible. ¡No se te va a cobrar por la cantidad de palabras!


Saludos,
  • 0

#7 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 13 abril 2013 - 12:36

Ha... por cierto, quizá este enlace también te ayude a comprender mejor el proceso.
Es una calculadora online que muestra paso a paso como va quedando la matriz y describe que se ha hecho en cada movimiento. Recomiendo que actives la casilla para que automáticamente coloque la matriz identidad y se consiga la forma ampliada.

Es Muy útil para comprender el funcionamiento del algoritmo y en como se esfuerza en llegar a la forma de Echelon.

Llendo al código, considero que lo más fácil es que trabajes con una única matriz y en ella almacenes directamente la matriz ampliada. Cuando le pidas al usuario que determine el tamaño (m x n) simplemente la haces de (m x 2n). Luego almacenas en la "mitad" izquierda a la matriz original, y luego en la 2da mitad la matriz identidad.

Saludos,
  • 0

#8 jooz

jooz

    Member

  • Miembros
  • PipPip
  • 45 mensajes

Escrito 15 abril 2013 - 07:56

hola y gracias por tus respuestas estoy intentando hacerlo con la opcion que me diste de convertirlo en fraccion ya que eso fue lo que me dijo el prof cuando le pregunte..... en cuanto tenga algo de codigo te lo muestro para que me des tu punto de vista.... nuevamente gracias.......
  • 0

#9 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 20 abril 2013 - 03:20

Hola.
¿No hay novedades aún? Porque me extraña que no hayas expuesto alguna duda sobre el proceso o el algoritmo. ¿Lograste avanzar?
En mi parecer de que se deba mostrar enforma de fracción es algo secundario. El esfuerzo esta en el algoritmo.

El procedimiento es muy sencillo, aunque he visto algunas bibliografías que se complican para exponerlos.

Veamos, Gauss-Jordan es el proceso de Gauss para resolver sistemas de ecuaciones pero con retroceso o vuelta atrás (este es el aporte de Jordan) y para empezar se amplia la matriz de forma que se añada a la derecha la matriz Identidad.
Ya podemos hacer Gauss como si ahora la matriz ampliada m x (n+m) fuese un sistema de m ecuaciones por n+m variables:

Por c/variable i=1 hasta n+m hacer:
1) Reducir variable i de ecuación i >> Fila(i) = Fila(i) * 1/Aii
2) Anular variable i del resto de las ecuaciones:
2.1) Por c/ecuación j=i hasta m hacer:
>> Fila(j) = Fila(j) -  Aji * Fila(i)
2.2) Por c/ecuación j=1 hasta i-1 hacer:
>> Fila(j) = Fila(j) - Aji * Fila(i)

¿Que se está haciendo?
El algoritmo lo que hace es reducir a cada variable de la diagonal a 1. Se observa justamente cuando en la operación Fila(i) = Fila(i) * 1/Aii. Por ejemplo, supongamos que en la fila 1 tuviéramos esto:
5 -2 6 | 1 0 0

Para reducir ese 5 a 1 lo que se hace es justamente dividir toda la fila por 5, o que es lo mismo multiplicarla por 1/5:

5/5 -2/5 6/5 | 1/5 0 0 = 1 -2/5 6/5 | 1/5 0 0

Ahora lo que debe hacerse es justamente anular a esta variable 1 del resto de las ecuaciones, como en el ejemplo se trata de una matriz 3 x 3, solo nos resta ir hacia las filas 2 y 3 y poner la columna 1 (exceptuando obviamente el elemento de la diagonal) en 0. Esto se consigue examinando el valor de las variables A(2,1) y A(3,1) respectivamente.

Si por ejemplo la matriz fuera:

1 -2/5 6/5 | 1/5 0 0
3  2    4    | 0    1 0
2  6    3    | 0    0 1

Para que la columna 1 quede: (1 0 0)^T siendo ^T la traspuesta debe hacerse:

fila 2:
(3, 2, 4 | 0 1 0) - 3 * (1, -2/5, 6/5 | 1/5, 0, 0) = (0, 2 + 6/5, 4 - 18/5 | -3/5, 1, 0)
= (0, 16/5, 2/5 | -3/5, 1, 0)

fila 3:
(2, 6, 3 | 0 0 1) - 2 * (1, -2/5, 6/5 | 1/5, 0, 0) = (0, 6 + 4/5, 3 - 12/5 | -2/5, 0, 1)
= (0, 34/5, 3/5 | -2/5, 0, 1)

Entonces tras la primera variable llegamos a la matriz
1, -2/5,  6/5 | 1/5, 0, 0
0, 16/5, 2/5 | -3/5, 1, 0
0, 34/5, 3/5 | -2/5, 0, 1

Ahora debemos ir por la segunda variable, desde fila 2:
1) Reducir A(2,2) a 1.
2) Anular la columna 2:
2.1) Fila(3) = Fila(3) - A(3,2) * Fila(2)
2.2) Fila(1) = Fila(1) - A(1,2) * Fila(2)

Entonces al ir eliminando cada variable la nueva sub-matriz se cuenta  desde la columna siguiente hacia la derecha.

El paso 2.2 es el retroceso. Lo hace es adelantar pasos y no esperar a realizar la vuelta atrás una vez finalizado y eliminado todo. Se puede ver justamente la aplicación en el ejemplo cuando nos volvemos hacia la fila 1 a fin de hacer 0 en A(1,2).

Cuando finaliza, y hay solución, la matriz identidad ahora a quedado como la inversa mientras que la matriz de la izquierda ha cambiado a la identidad.

Espero que se entienda.

Ahora bien, esto es en la práctica de papel. En términos numéricos Gauss-Jordan tiene un problema de precisión debido al redondeo. Para corregir este problema se hace uso del pivoteo. ¿En que consiste? Simplemente se busca dentro de la matriz izquierda el mayor valor absoluto. A la fila con dicho mayor se la intercambia por la primera (obviamente si ya es la primera fila no se hace esto). Luego ya se puede operar.


Saludos,
PD: La matriz del ejemplo la hice al vuelo. No garantizo de que efectivamente tenga inversa.
  • 0

#10 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 20 abril 2013 - 11:57

He editado mi mensaje anterior a fin de corregir una serie de errores que había cometido anoche mientras escribía y de paso añadí un ejemplo para ilustrar los pasos.

Saludos,
  • 0

#11 jooz

jooz

    Member

  • Miembros
  • PipPip
  • 45 mensajes

Escrito 20 abril 2013 - 08:55

Delphius gracias por toda tu ayuda... es muy util para mi .... esta semana estare montado en eso.... ahora lo que me trae de cabeza es como conformar mi matriz con un numerador y un denominador..... ya que segun mi profesor es la manera en que debo de trabajar... lo he intentado de varias maneras pero no me sale.... una conpañera me dijo que podia crear una matris tipo string y en mi posision [i][j] guardar algo como asi: 2/3, luego convertir el texto a entero separarlo en dos variables realizar las operaciones y volverlo a convertir a texto..... pregunto se podra hacer eso o hay una forma mas facil de hacerlo ????????
  • 0

#12 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 20 abril 2013 - 11:52

Hola,
¿En serio tu profesor les pidió que internamente operen como si fuera fracciones?
Me cuesta creerlo, no es del todo aconsejable, y ni que decir... muy posiblemente contraproducente en términos de cálculo debido a que de una u otra forma deberás llevas los cálculos con el tipo double.

De poder se puede, pero es una receta hecha para el desastre. ¿Porqué? Porque hará más complicada las cosas... sobre todo para implementar adecuadamente las sumas (restas) y multiplicaciones (divisiones). Necesariamente deberás definir dentro de toda tu operatoria un algoritmo capaz de llevar todo en una aritmética basada en fracciones y tener muchas cosas presente.

Primero, en lo que hace a la matriz, cada posición deberá ser de un tipo de dato que represente a una fracción.
En Delphi existe lo que se conoce como registro o record. No es más que una estructura de datos definida por el usuario donde uno puede diseñar bajo un mismo identificador una serie de campos o atributos (de tipos de datos simples). Lo que yo haría es esto:



delphi
  1. type
  2. TFraccion = record
  3.     Num, Den: integer;
  4.   end;
  5.  
  6. ...
  7. var Frac: TFraccion;
  8. ...
  9. // Almaceno el número 5/12:
  10. Frac.Num := 5;
  11. Frac.Den := 12;



Y para el caso de los negativos, basta con que se pase en Num o Den en negativo. Por ejemplo:



delphi
  1. // -2/3 equivale a:
  2. Frac.Num := -2;
  3. Frac.Den := 3;



Si no me equivoco, en C existe el concepto análogo bajo el nombre Structure  ;)

Entonces a la matriz la declaro de este tipo:



delphi
  1. type
  2.   TMatriz = array of array of TFraccion; //matriz dinámica



Y ahora para hacer uso de ésta basta con que haga algo así:



delphi
  1. var A: TMatriz;
  2. ...
  3. // Almaceno en (3,2) 6/9
  4. A[3,2].Num := 6;
  5. A[3,2].Den := 9;



Creería que en C es posible hacer algo como esto.

Una vez que ya tienes solucionado esto. Viene lo complejo. No es posible hacer de forma directa algo como:
A[2,4] = A[3,2] + A[5,1];

Y que mágicamente se opere como en las fracciones de toda la vida. Necesariamente deberás llevar los cálculos por tu propia cuenta. Aquí repasarás lo que viste en primaria... usa el lapiz y el papel... ¿Cómo le haces a mano? Pues eso... ahora deberás implementarlo aquí. Para cada operación deberás implementar su algoritmo.

Repasemos juntos:
Siendo n/d el numerador y el denominador, entonces:

Suma y Resta:
Sea n1/d1 y n2/d2 dos fracciones, la suma se hace con los siguientes pasos:
1) se multiplica d1 y d2 y se pone en el denominador del resultado >> d3 = d1 * d2
2) Vamos a calcular el numerador:
2.1) Para el primer miembro se divide d3 con d1 y se multiplica por n1 >> n3a = (d3 / d1) * n1
2.2) Para el segundo miembro de forma análoga: n3b = (d3 / d2) * n2
3) El numerador será entonces la suma de estos dos >> n3 = n3a + n3b
4) El resultado final es n3/d3

CUIDADO: la división (/) en este contexto corresponde a la división entera. Recuerda que si bien estamos utilizando fracciones (en algunos lugares les llaman quebrados) cada valor del numerador y el denominador pertenece al cuerpo de los números enteros.
A nivel de código debe hacerse distinción. Al menos en Delphi se tiene el operador DIV que es para divisiones enteras, mientras que / es para reales.

La resta es similar, en lugar de hacer n3 = n3a + n3b se aplica una substracción:
n3 = n3a - n3b.

Multiplicación:
La multiplicación de fracciones es sencilla de hacer. Sea n1/d1 y n2/d2 el resultado n3/d3 corresponde a:
n3 = n1 * n2
d3 = d1 * d2

División:
Si recordamos el producto cruzado, sea n1/d1 y n2/d2 la división (n1/d1)/(n2/d2) consiste en:

n1      n2    n1 * d2
---  % --- = ----------
d1      d2    d1 * n2

O visto así:
  n1
  ----
  d1
---------
  n2
  ----
  d2

Se multiplican los extremos superior externos y se coloca en numerador n3 = n1 * d2
Se multiplican los internos y se coloca en el denominador d3 = d1 * n2

¿Viste? Es útil recordar cosas de las matemáticas que nos enseñaron en la escuela  :) A modo de off-topic esto es un mensaje dedicado para todos aquellos que se quejan y reniegan de para que estudiar x cosa si luego no te va a servir.... en especial para aquellos negados a la tan bella y mal comprendida matemática.  *-)

Listo... ya tenemos hechas las operaciones y nos aseguramos que los cálculos se hagan como en la escuela. Pero no termina aquí las cosas. Hay algo especial en las fracciones... las equivalencias. Así es que de pronto nos damos con que:
1/1 = 2/2 = 7000/7000 = 1

O que:

1/2 = 2/4 = 3/6 ....

Si sólo hiciéramos las operaciones como lo hemos descripto llegaremos a números tan grandes que no entenderíamos el número real al que representan. Por ejemplo: 457/356 o 1578/964. ¿Que debemos hacer? Reducirlo, buscar la mínima expresión posible.

¿Cómo se procede? De nuevo vamos a 5to grado de primaria. El algoritmo que hacemos a mano consiste en ir diviendo tanto el numerador y el denominador por un factor buscando que éstos sean múltiplos hasta que ya no sea posible continuar. Empezamos con 2 y dividimos hasta donde sea posible, luego vamos con el 3, 4, etc.

Pero hacer esto en la computadora como que no va. Debe haber una forma más directa. A ver, pensemos... ¿que es en última lo que estamos buscando? El Máximo Común Divisor... o comunmente llamado MCD. ¿Cómo se calcula? Ha... para eso nos remontamos al tan famoso algoritmo de Euclides.

Listo, una vez calculado el MCD, entonces ya directamente reducir el número. Es decir que:
sea m = MCD(n3, d3) entonces:
n3 = n3 / m
d3 = d3 / m

Ya con esto creería que estarías en condiciones de seguir con tu trabajo. Al final resulta que este hilo se está convirtiendo más en repaso de álgebra lineal y de matemática que de una duda técnica  :D

Sigo pensando que implentarlo de esta forma es muy rebuscada. Me parece que se está mal interpretando el pedido del profesor y a lo que apunta el es que a efectos de visualización al final se muestre en forma de fracción. Que no necesariamente esto indica que internamente se opere así.

Así se pierde la esencia de la cátedra de Cálculo y no hace al objetivo real. Se está desviando la verdadera atención del concepto a presentar a un tema menor que al final tiene sus costos en el problema. Al menos así es mi parecer.
Yo siempre me digo que si fuera profesor sería muy HDP con mis alumnos, pero no llegaría al extremo que ha llegado tu profesor con este "extraño" pedido... aunque quien sabe. He escuchado historias de cada profesor de algunas universidades que te avientan con cosas tan ridículas en un examen que ya te hacen dudar de si son puros chismes exagerados para asustar a los recién ingresados sobre la dura vida universitaria o si en verdad lo han hecho (1)

(1) Por ejemplo, en un caso verídico que le ha pasado a mi primo mayor. Durante un examen oral el profesor le preguntó cuantos escalones tiene cierto monumento (que no recuerdo ahora cual) que está en una plaza de Tucumán (mi primo estudió allí). Mi primo quedó con cara de Poker Face y suspendió por eso. Cuando nos encontramos en la reunión familiar nos contó su relato. Yo no me lo creía pero luego me aseguraron el resto de mis primos, conocidos y allegados a dicho profesor que así es esa persona y lo hace siempre con todos los estudiantes. Se lleva el máximum god of trolling.

Volviendo a tu caso, espero que tu profe no sea de esos tipos.  :D

Saludos,
  • 0

#13 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 22 abril 2013 - 04:06

Mi consejo, olvidate del "detalle" de que se haga con fracciones o moriras en el intento! Dile a tu profe que "se te olvido" el detalle pero que por lo demás te funciona perfectamente, y listo.

¿Porque? Porque PI, raíz de 2, Ln(7) etc. son números que te puede salir en una matriz, y esos no hay quien los ponga como fraccion de numeros enteros (es imposible, ni lo intentes), así que te pide un imposible, dile que eso se da en el siguiente curso!

¿Que él nunca te pondría ese tipo de números en un problema?... vale, pero te pueden salir en la solución "espontaneamente" engendros similares, y el lio que montas en cualquier caso es mucho más complejo que el problema en sí.
  • 0

#14 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 22 abril 2013 - 08:03

Mi consejo, olvidate del "detalle" de que se haga con fracciones o moriras en el intento! Dile a tu profe que "se te olvido" el detalle pero que por lo demás te funciona perfectamente, y listo.

¿Porque? Porque PI, raíz de 2, Ln(7) etc. son números que te puede salir en una matriz, y esos no hay quien los ponga como fraccion de numeros enteros (es imposible, ni lo intentes), así que te pide un imposible, dile que eso se da en el siguiente curso!

¿Que él nunca te pondría ese tipo de números en un problema?... vale, pero te pueden salir en la solución "espontaneamente" engendros similares, y el lio que montas en cualquier caso es mucho más complejo que el problema en sí.

Muy cierto lo que comentas Sergio.
Yo también he dicho antes que no es un planteo aconsejable y que dará problemas de cálculo.
Como bien indicas, los irracionales no hay modo que calcen en forma de fracción. Cuanto mucho se puede llegar a una aproximación fraccional (que no es del todo aconsejable).

Y haces bien al indicar que es muy posible que se den casos que internamente se llegue a números irracionales aún cuando se tenga cuidado de "elegir" los números para que no salten problemas.

El punto es que con cada operación a nivel de fracción se está perdiendo decimales. Como se está forzando a emplear números enteros no se aprecia ese resto o residuo de las divisiones. Con cada una se va acumulando más y más el error. Resultando finalmente en una enorme posibilidad de que los fraccionales obtenidos no sean del todo exactos.
Estimo que mínimamente llevarlo por esta vía el error será de 1ulp en cada posición de la matriz.

Yo ya hice la advertencia antes, pero bueno. Si está convencido de seguirle pues...

Saludos,
  • 0




IP.Board spam blocked by CleanTalk.