| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
kykyou
Registrado: 02 Sep 2004 Mensajes: 67 Ubicación: santiago, Chile..
| Publicado: 10/06/2005 5:47 pm | | | Título: Determinante de una matriz?? |
| Hola: Estaba tratando de hacer un algoritmo para obtener el determinante de una matriz por la place... Creo que es un buen propuesto para los que les gusta hacer algoritmos  Eso si, es para una matriz de mxn, o sea, para cualquier matriz. Y debe lanzar sus respectivas advertencias si es que a la matriz no se le puede calcular el determinante( caso en que m!=n) Bueno, a mi se me habia ocurrido hacerlo con una funcion recursiva y que el caso principal sea cuando la matriz quede de 2x2. Bueno..se los dejo^^
A mi parecer solo requiere pensar un poquito. Y eso es lo que hare apenas tenga tiempo 
Nos vemos!! |
| | Volver arriba | |  | pitukilloloco
Registrado: 11 May 2005 Mensajes: 448
| Publicado: 10/06/2005 6:45 pm | | | Título: |
| | En cualquier libro de análisis numérico viene la resolución del determinante de una matriz. No veo por qué habría que tratar de resolverlo si ya están descritos ahí los algoritmos para hacerlo. Muchas veces se trata de mejorar un algoritmo que ya existe por cuestiones de eficiencia o de rapidez ¿es quizá esta tu motivación? ¿o no conoces ningún algoritmo que implemente esto? |
| | Volver arriba | |  | grandzam
Registrado: 10 Feb 2005 Mensajes: 159
| Publicado: 11/06/2005 6:57 pm | | | Título: |
| Aquí esta la implementación de un subprograma que resuelve determinantes en visual basic, ahora solo tienes que implementarlo en c.
Notas: 1. Redim no es una función de c asi que piensa que puedes hacer 2. Es un programa recursivo (se manda llamar a si mismo), si no entiendes lo que hace por favor manda otro mensaje para explicarte, pero primero piensa y entiende que es lo que hace...
Bueno a diferencia del compañero que contesto este mensaje antes, yo creo que es bueno que la gente nueva empiecen a hacer sus propios algoritmos y sobretodo a PENSAR, porque después se malacosumbran y quieren sacar todo de internet o de los libros, claro que leer libros y entrar a foros como este y preguntar sus dudas nos ayuda mucho a aprender más a todos, tanto a quien pregunta como a quién contesta.
Y esto no lo escribo para ofender a nadie, simplemente en mi opinión tratar de hacer un algoritmo de estos siempre ayuda a nuestro intelecto...
Otra cosa si la matriz no tiene solución (según entendí) cuando m!=n ('m' diferente de 'n') entonces solo va a tener solución cuando 'm' sea igual a 'n', si es ese el caso entonces, es una matriz de n*n
Y bueno la verdad pensando te enseñas mejor...
| Código: |
Public Sub Calc_Det(ByRef D() As Single, ByVal Orden As Integer, ByRef res As Single) Dim col, j, Fila, L As Integer Dim D2() As Single Dim r2 As Single res = 0 If Orden = 1 Then res = D(1, 1) Else If Orden = 2 Then res = (D(1, 1) * D(2, 2)) - (D(1, 2) * D(2, 1)) Else ReDim D2(1 To r, 1 To r) For col = 1 To Orden For Fila = 2 To Orden j = 1 For L = 1 To Orden If L <> col Then D2(Fila - 1, j) = D(Fila, L) j = j + 1 End If Next L Next Fila Calc_Det D2, Orden - 1, r2 r2 = r2 * D(1, col) If (col Mod 2) <> 0 Then res = res + r2 Else res = res - r2 End If Next col End If End If End Sub
|
|
| | Volver arriba | |  | | kykyou
Registrado: 02 Sep 2004 Mensajes: 67 Ubicación: santiago, Chile..
| Publicado: 13/06/2005 1:09 pm | | | Título: |
| Hola, Gracias por responder. No te preocupes, no creo tener problemas... Para el que respondio primero, en realidad odio los libros, no encuentro cosa mas fome que ver una resolucion en un libro y como no lo vi en el foro (ya que lo busque) lo postee viendo que nadie lo habia hecho y pensando que podria servir a mas de alguna persona. Prefiero pensar. Ademas no es por saber la respuesta...es por diversion. No es tarea, no es nada. Mi ramo de C ya lo pase el semestre pasado. Ademas fue solo lo basico porque aun asi no estudio nada que requiera saber mas.
Bueno, le doy las gracias por sus respuestas =.
Saludos,
Kykyou.
PS : He ahi la gracia de hacer un algoritmo por mas simple que sea. |
| | Volver arriba | |  | Diabliyo
Registrado: 14 Abr 2004 Mensajes: 325 Ubicación: En la Luna
| Publicado: 14/06/2005 12:07 pm | | | Título: |
| Hola:
kykyou pues aunque no creas a NADIE le gusta leer, pero llegas a un nivel en el que comprendes que un LIBRO es un conjunto de datos que te ayudan a SUPERARTE, y te aseguro que NO ahi mejor cosa que aprendas, mas lo que esta en lso LIBROS...
Nose que edad tengas, pero el chiste no es saber y pasar, se supone que si elijes una carrera y un objetivo, es para ser el MEJOR y no un Mediocre (ose del monton) ... tambien recuerda que un 10 es solo un numero... y se ve a diario que los MAS INTELIGENTES no siempre llegan a ser los mejores... desconfia de los de 6 porke son gente interesante que posiblemente por el simple echo de ser mas astuta que tu, supoe realizar las cosas ...
Todo es por ti, solo una vez se vive... y no ahi cosa mejor que ser Elite 
byeee _________________
|
| | Volver arriba | |  | kykyou
Registrado: 02 Sep 2004 Mensajes: 67 Ubicación: santiago, Chile..
| Publicado: 15/06/2005 6:52 pm | | | Título: |
| | Diabliyo escribió: | Hola:
kykyou pues aunque no creas a NADIE le gusta leer, pero llegas a un nivel en el que comprendes que un LIBRO es un conjunto de datos que te ayudan a SUPERARTE, y te aseguro que NO ahi mejor cosa que aprendas, mas lo que esta en lso LIBROS...
Nose que edad tengas, pero el chiste no es saber y pasar, se supone que si elijes una carrera y un objetivo, es para ser el MEJOR y no un Mediocre (ose del monton) ... tambien recuerda que un 10 es solo un numero... y se ve a diario que los MAS INTELIGENTES no siempre llegan a ser los mejores... desconfia de los de 6 porke son gente interesante que posiblemente por el simple echo de ser mas astuta que tu, supoe realizar las cosas ...
Todo es por ti, solo una vez se vive... y no ahi cosa mejor que ser Elite 
byeee |
Lo que dices es cierto... Pero ten en cuenta que mi especialidad no es esto. mi carrera no tiene NADA que ver con la programacion. Es solo una cosa de aficion mia y nada más...eso ya lo he dicho. Cosa que no me gusten los libros no es que no me guste leer..simplemente prefiero llevar a cabo lo que leo y desde un libro no es muy comodo...ahh, y prefiero aprender en páginas web ^^U..es más comodo y sin duda más barato. Pero en fin...no quiero ser mala onda y nada, gracias por los consejos. Me gusta mucho el ambiente de esta página como para enemistarme con alguien, solo que tampoco me gusta que me respondan mal pu o en modo despectivo. Y no dudes en que no soy del monton (o por lo menos trato de no serlo), ni tampoco subestimo a los de "6" que en mi caso seria 4 o 5 :S Pues en mi pais la nota maxima es el 7 =P
De nuevo, gracias por todo!! |
| | Volver arriba | |  | | tonilope
Registrado: 16 Oct 2005 Mensajes: 255
| Publicado: 18/10/2005 2:29 am | | | Título: Yo tengo una solución recursiva. |
| Yo lo hice hace casi dos años (desde cero tb, a modo de reto personal). La verdad es que al principio la idea estaba clara pero no fue hasta un día en clase de álgebra que me vino la inspiración xD. Bueno, no me enrollo más, aquí lo tienes si lo quieres como guía de pistas:
| Código: | /* CALCULADOR de DETERMINANTES de orden n Autor: Antonio López Vivar Fecha: 1 de diciembre de 2003 Revisión: final 1.0 */
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <conio.h>
//Prototipos float Determinante (float **, int); void Adjunta (float **, float **, int, int); //Principal void main() { int n, i, f, c; float **matriz; char comando; for(i=0; i<3; i++) { printf("\n\n\tBienvenido al CaLcuLaDOR de DeTERminanTes de orden n marca MIKASA"); sleep(500); system("cls"); printf("\n\n\tBienvenido al CaLcuLaDOR de DeTERminanTes de orden n marca MIKASA"); printf("\n\n\n\n\n\n\n\t\t\tUna utilidad de Antonio Lopez Vivar"); sleep(500); system("cls"); } do{ do{ system("cls"); printf("\n\n\tNota--> Este programa utiliza una funcion recursiva. Abstenerse de introducir matrices de orden elevado (mayor de 10), puesto que el consumo de RAM puede ser bestial"); printf("\n\n\tORDEN?>\t"); scanf("%d", &n); }while(n<1); //Petición de memoria dinámica para la matriz matriz=(float**)calloc(n, sizeof(float*)); if(matriz==NULL) printf("ERROR, FALTA MEMORIA PARA LA MATRIZ. Introduzca un orden MUCHO mas pequeño"); else { for(i=0; i<n; i++) matriz[i]=(float*)calloc(n, sizeof(float)); //Lectura por teclado de la matriz for(f=0; f<n; f++) for(c=0; c<n; c++) {printf("\nIntroduce el elemento %d de la fila %d --->\t", c+1, f+1); scanf("%f", &matriz[f][c]); } //Se muestra la matriz al usuario system("cls"); printf("\n\n\n"); for(f=0; f<n; f++) { printf("\t\t"); for(c=0; c<n; c++) printf("%12.1f ", matriz[f][c]); printf("\n"); } printf("\n\n\n\t\tCalculando el determinante, por favor espere...\n\t\t(Para abortar el calculo pulse CTRL+C)\n"); printf("\n\n\n\n\n\t\t\tEl determinante es:"); printf("\n\n\n\t\t\t\t%.1f\n\n\n\n\n\t\t", Determinante(matriz, n)); //Se libera la memoria solicitada free(matriz); } printf("Pulsa INTRO para calcular OTRO determinante, o pulsa S para SALIR"); fflush(stdin); comando=getch(); }while(comando!='s' && comando!='S');
}
/* Esta función recursiva se encarga del cálculo del determinante propiamente dicho. Recibe: - La matriz (referencia). - Orden de la matriz (valor).
Devuelve: - El determinante (valor). */
float Determinante (float **mat, int orden) { float det; int h; float **auxiliar; //Caso básico if(orden<=2) { if(orden==2) det=mat[0][0]*mat[1][1]-(mat[1][0]*mat[0][1]); else det=mat[0][0]; } //Se calculan n determinantes de orden "n-1". else { //Petición de memoria dinámica para la matriz auxiliar auxiliar=(float**)calloc(orden-1, sizeof(float*)); for(h=0; h<orden-1; h++) auxiliar[h]=(float*)calloc(orden-1, sizeof(float)); //Se usa un acumulador para ir sumando los determinantes de orden n-1 det=0; for(h=0; h<orden; h++) { Adjunta(mat, auxiliar, orden, h); det+=pow(-1, h)*mat[h][0]*Determinante(auxiliar, orden-1); } //Se libera la memoria auxiliar solicitada free(auxiliar); } return(det); }
/* Esta función se encarga de calcular la matriz resultante de tachar la primera columna y alguna de las n filas de la matriz inicial. Recibe: - La matriz inicial (referencia). - El orden de la matriz inicial(valor). - La fila que hay que tachar de la matriz inicial (valor).
Devuelve: - La matriz auxiliar que se usará para calcular los determinates de orden n-1 (referencia). */ void Adjunta (float **mat, float **aux, int orden, int pos) { int fila, columna, j, i; for(j=0, fila=0; fila<orden-1; j++, fila++) { if(j==pos) fila--; else for(i=1, columna=0; columna<orden-1; i++, columna++) aux[fila][columna]=mat[j][i]; } }
|
Salu2  |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |