Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Expresiones algebraicas (https://www.clubdelphi.com/foros/showthread.php?t=53415)

rauros 20-02-2008 15:23:04

Expresiones algebraicas
 
Saludos. Me gustaría saber como poder obtener la solución de una expresión algebraica de primer y/o segundo grado. Os refresco la memoria porque parece que el único que sigue en el instituto soy yo xD.

1er grado:

x - (3x + 90)/5 = x/3

Creo que x = 1350

2do grado.

y + x = 22 - 3y
2y = 12 - x

Aquí x=2 & y=5

Pues me gustaría saber como se pueden calcular con delphi, a mi no se me ocurre ninguna manera :S.

Ivanzinho 20-02-2008 16:49:27

Cita:

Empezado por rauros
Os refresco la memoria porque parece que el único que sigue en el instituto soy yo xD.

1er grado:

x - (3x + 90)/5 = x/3

Creo que x = 1350

Creo que al que hay que refrescar la memoria es a ti ;):).

Lo primero que debes hacer antes de programarlo es saber hacerlo en papel.

Para empezar se me ocurre que deberías analizar la expresión, introducida como un string, identificando cada uno de los operandos de la ecuación separados por + o -. En el ejemplo anterior sería x, -(3x + 90)/5 y x/3 sabiendo en cada momento a que lado del igual se encuentra cada operando.

Expresiones como -(3x + 90)/5 tendrás que descomponerlas hasta llegar a expresiones simples -3x/5, -18. En caso de que haya expresiones complejas dentro de otras expresiones complejas deberías utilizar recusividad.

El siguiente paso sería obtener todos los divisores (aqui tenemos 3 y 5) para hallar em mínimo común múltiplo y eliminarlos. En este caso tendriamos como mínimo común múltiplo el 15.

Una vez calculado el mínimo común multiplo eliminaríamos los divisores, obteniendo una expresión más simple. 15x - 9x - 270 = 5x.

Ahora sólo faltaría calcular el factor que múltiplica la incognita y despejar.

Par el caso en que se tenga dos variables con dos ecuaciones el caso sería paracido a lo comentado anteriormente para despejar una de las variables y luego reemplazar en la otra ecuación para terminar haciendo exactamente los mismos pasos que en el caso anterior.

Ten en cuenta que esto es sólo una idea de como abordar el problema que se me ocurrio sobre la marcha, seguro que analizando se puede llegar a un método mucho mejor, pero para darte un enfoque de como resolver le problema creo que puede valer.

Un saúdo y espero que te sirva de ayuda.

rauros 20-02-2008 16:57:59

Tranquilo, yo desde la hoja ya se hacerlo, de todas las formas. Lo que pasa es que nunca he usado string. Tengo un libro de delphi 7 pero tiene 1052 paginas, de las cuales solo me he leído 3 jaj. Supongo que habrá que decirle a string separar cada signo de +-/* y excepción al primer número. El problema es que no sé como hacer eso. Yo de mientras iré pensando algo para hacer con cada numero y signo.

Ivanzinho 20-02-2008 17:08:10

Puedes empezar mirando bucles, recursividad y las funciones Copy, Length, StrToInt, IntToStr, FloatToStr, StrToFloat y StringReplace entre otras. Según vayas avanzando con el proyecto y tengas dudas puedes postearlas y te ayudaremos con gusto.

Un saúdo.

maeyanes 20-02-2008 17:40:44

Hola...

También es bueno que te documentes sobre la Notación Polaca Inversa la cual se usa para resolver este tipo de problemas...



Saludos...

ixMike 20-02-2008 17:59:35

Cita:

Empezado por rauros (Mensaje 267233)
2do grado.

y + x = 22 - 3y
2y = 12 - x

Aquí x=2 & y=5

Temo informarte de que eso no son ecuaciones de segundo grado. De segundo grado son cuando la única incógnita está elevada al cuadrado. Eso que has puesto es un sistema de dos ecuaciones con dos incógnitas.


Salu2.

rauros 20-02-2008 18:21:28

Lol? Pos estoy equivocado, con lo de segundo grado me quería referir a que tiene más de una incógnita. Perdón.

ixMike 20-02-2008 18:29:12

Cita:

Empezado por rauros (Mensaje 267308)
Lol? Pos estoy equivocado, con lo de segundo grado me quería referir a que tiene más de una incógnita. Perdón.

jeje :D, no pasa nada, ¡pero que no te oiga el profesor! ;)

rauros 20-02-2008 18:39:05

Jaj muy buena. Ahora estoy leyendo y intentando entender los comandos. Si lo que yo he entendido de cada uno es (mirad si estoy equivocado):

·Copy De este más bien poco. (¿copiar y pegar?)

·Lenght(s) El tamaño de s en número.

·StrToInt Intenta introducir un valor string a otro integer.

·IntTostr Intenta introducir un valor integer a otro string.

·floatToStr Intenta introducir un valor float (con decimales??) a otro string.

·StringReplace De esté no entendí nada.

Toda la ayuda la intente sacar de la ayuda rápida (f1). Gracias a todos por ayudarme en mis proyectos. Ahora, he leído sobre la notación polaca inversa, pero no sé que se le puede atribuir a lo que quiero hacer :S.

EDITADO: Manejo a la perfección for y if then else por si sirve de algo.

Delphius 20-02-2008 19:03:12

Hola Rauros,
La explicación viene así:

1. Copy: copia de un string a otro. El primer parámetro es el texto a copiar (puede ser una variable string), el segundo desde que posición empieza a contar, y el tercero la cantidad de caracteres a copiar.

UnString := Copy('Hola mi nick es Delphius',1,4');

En este caso el resultado es 4.

2. Los formatos xxxToyyy no es que intentan introducir, sino que convierten del tipo xxx al tipo yyy. Por ejemplo: StrToInt lo que hace es convertir un string a un integer.

Si acercaste a medias al decir intenta. Pues si el string que se suministra como parámetros es inválido (no reconocido como un número) se producirá un error (mejor dicho excepción).

StringReplace: Reemplaza un string por otro. Recibe en orden, el texto a analizar, el string a reemplazar, el string por cual reemplazar. Y el último parámetro es un tanto "especial" Dependiendo de lo introduzcas puedes hacer que reemplaze todas las ocurrencias, que solamente sea la primera, y/o que sea case sensitive.

EDITO:
El manejo de la notación polaca inversa permite escribir las escuaciones de manera más fácil para hacer las operaciones. Al escribir (a(b + c))/3 + 2
Se te hace más dificil programar el algoritmo de resolución. Pues debes tener en cuenta la posición de los paréntesis e ir resolviendolos en dicho orden:
1) (b + c), digamos que tenemos una variable aux que guarda el valor. Y nos queda: aux = b + c
2) (a*aux), lo que nos lleva a aux = aux * a
3) aux/3, que nos da un aux = aux/3
4) aux + 2, que nos da un aux = aux + 2
5) aux. Queda en aux el valor conseguido.

Con el método de notación polaca inversa, se ingresa los operandos y las operaciones en el orden en que se resuelven, y por tanto te olvidas de los paréntesis y otras operaciones complejas. Si no falla el dedo viene así:
bc+a*3/2+

Que se lee así:
1. bc+: sumar b a c y guardar valor en c, c = c + b
2. ca*: multiplicar c por a y guardar valor en a, a = a * c
3. a3/: dividir el valor de a en 3, guardar en a, a = a/3
4. a2+: sumar 2 a a, guardar valor en a, a = a + 2.

¿Ves la diferencia? La lectura de las operaciones se hace en forma directa. Mientras que con el primero debes ir de "adentro" hacia "afuera"

Espero que esto pueda aclararte una idea, además de este método piensa en un bucle y en sentencias CASE. Creo que con estas pistas, ya te podrías imaginar algún algoritmo.

Por cierto, quisiera preguntarte hasta que tamaño de sistemas de ecuaciones deseas resolver. Porque el algebra tiene una herramienta poderosa para resolver sistemas de ecuaciones. Un método se conoce bajo el nombre de su "inventor": Gauss-Jordan.

Saludos,

maeyanes 20-02-2008 19:34:30

Hola...

Cita:

Empezado por rauros (Mensaje 267316)
Toda la ayuda la intente sacar de la ayuda rápida (f1). Gracias a todos por ayudarme en mis proyectos. Ahora, he leído sobre la notación polaca inversa, pero no sé que se le puede atribuir a lo que quiero hacer :S.

EDITADO: Manejo a la perfección for y if then else por si sirve de algo.

Para resolver operaciones matemáticas desde un programa, pasándole a este un string del tipo (5 + 8) * 9 (notación Infija), es necesario convertir esa operación a notación postfija (o polaca inversa): 9 * 5 8 +

Para resolver esto necesitas una estructura tipo LIFO (Last In First Out), la más usada es una pila.

En la web puedes encontrar varios algoritmos para convertir de infijo a postfijo.


Saludos...

P.D. Veo que Delphius ya dio una explicación sobre esto...

rauros 20-02-2008 19:38:55

Lo primero, muchísimas gracias, que se os ve con muchísimo ánimo para ayudar, y yo no puedo hacer nada por vosotros, así que me siento súper agradecido. Empezando, sigo sin entender una cosa. Las operaciones de álgebra tienen un igual en medio, y operaciones a derecha e izquierda. Ejemplo
Código:

  | izquierda
  |    |Derecha
  |    |
a + 4 = 2a  //Aquí  a = 4



Pues me gustaría que me enseñaran como llegar a transformar eso en la notación polaca inversa.

Yo pienso que esto sería a4+ = a*2 (pero esto no llegaría a ninguna parte en delphi)

NOTA: he leído sobre la eliminación gaussiana pero se ve que tengo la mente aun poco madura para entender esas cosas.

Delphius 20-02-2008 20:48:35

Rauros, veo que vas entendiendo. La notación hungara te servirá para ir resolviendo las ecuaciones miembro a miembro. Lo que tu deberías resolver es el pasaje de un miembro a otro, al igual que con la notación normal, hasta conseguir que en miembro quede el resultado y en el otro la variable.

Con tu ejemplo sería asi:
a4+ = 2a*
Resto a ambos miembros:
4 = 2a*a-

Y para comprobar que es correcto, sustituímos el valor en dicha ecuación:

4 = 24*4- // Se mutiplica 2 y 4
4 = 84- // se resta 4 a 8
4= 4 // Se cumple la operación

Esto es relativamente simple cuando se trata de una sola ecuación.

Pero cuando se trata de sistemas de m ecuaciones con m incognitas es un poco más lioso. En estos momentos tengo la cabeza en otra parte... y creo estoy mezclando cosas... si logro mantener la mente en calma y recuerdo algo te ayudo.

Saludos,

rauros 20-02-2008 20:57:11

Si pero a mi el gauss-jordan me parece más difícil que hacer una bomba nuclear con un Mc menú infantil y un litro de horchata...

Delphius 20-02-2008 21:02:20

rauros, disculpa estuve mezclando temas... gauss-jordan no es útil en este caso...

Nos estamos liando... Supuestamente estamos resolviendo igualación de ecuaciones ¿No es cierto?

Gauss-Jordan es para resolver sistemas de ecuaciones. Es otra cosa.

edite mi mensaje anterior.

Saludos,

rauros 20-02-2008 21:05:00

Y yo pensando que esto sería algo sencillo... De todos modos no pienso parar de buscar información hasta que no lo termine. Si encuentro algo relacionado lo aviso aquí.

Delphius 20-02-2008 21:18:56

Cita:

Empezado por rauros (Mensaje 267367)
Y yo pensando que esto sería algo sencillo... De todos modos no pienso parar de buscar información hasta que no lo termine. Si encuentro algo relacionado lo aviso aquí.

Bueno, por fin te diste cuenta de que en ocasiones lo sencillo es realmente más complicado de lo que es.
Lamento haberte mantenido así, pero sabiendo que te estás iniciando preferí buscar el modo en que tu te sientes a buscar a informarte sobre el tema en vez de irte tal vez por una solución barata.

En ocasiones la cura es peor que la enfermedad. Y sabiendo que estás iniciandote, peor aún.

¿Te digo un secreto? Existen componentes Delphi que hacen estos tipos cosas. No los he probado, ni conozco sus nombres. Pero de que los hay es muy seguro.

Si yo te decía que existen estos componentes, muy seguramente no hubiera despertado el interés de comprender la complejidad del tema y haberte formado el sentido lógico. Espero que no lo tomes a mal.
El problema al que puedes ver sometido con estos componentes es:
1. Como instalarlos.
2. Como usarlos.

En torry.net vas a tener más chances de encontrarlos.

Si es para una "tarea", habría que buscar la manera de simplificar el problema ¿No te parece?

rauros 20-02-2008 21:27:43

No me lo tomo a mal, no quiero una solución barata, yo siempre quiero entender lo que estoy programando, y si en ocasiones no puedo entenderlo, no lo uso. Así que buscaré uno para ver como funciona, y lo pondré por aquí para comentarlo entre todos, ya que yo me voy a marear en las lineas de comentario.

rauros 21-02-2008 22:57:59

He visto que si que hay una, pero que es de pago :S. Yo no puedo permitirme pagar por tales cosas, así que deberé abandonar por falta de métodos. Es que por mucho que le de vueltas a la cabeza no se si el problema es más matemático o más funciones delphi...

Delphius 22-02-2008 01:50:27

Cita:

Empezado por rauros (Mensaje 267726)
He visto que si que hay una, pero que es de pago :S. Yo no puedo permitirme pagar por tales cosas, así que deberé abandonar por falta de métodos. Es que por mucho que le de vueltas a la cabeza no se si el problema es más matemático o más funciones delphi...

Rauros, no nos supiste decir de si se trata de una tarea. Si lo estabas haciendo con el fin de practicar no hay problema, pero si se trata de una tarea hazla, al menos presenta lo que hayas entendido.

Independientemente de si se trata de una cuestión de aprender para práctica y/o si es un trabajo, no te rindas. De poder se puede, y en la informática tenemos la regla de que todo se puede.

Si te cuesta tanto, lo que debes hacer es acotar los límites del sistema, achicarlo un poco y trabajar sobre ello, una vez que consigas eso y si ves que te resulta viable continuar ampliarlo.

Saludos,


La franja horaria es GMT +2. Ahora son las 17:20:26.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi