Como formo lo ecuacion completa?

Iniciado por Edu, 2 Abril 2011, 18:48 PM

0 Miembros y 2 Visitantes están viendo este tema.

Edu

Estoy haciendo un programa q me calcularia las ecuaciones de primer grado, segundo grade y para arriba, y talvez luego hago q haga mas cosas de las q estoy aprendiendo en el colegio ya que te mandan muchos ejercicios y estaria bueno poder hacer un programa q te ayude con todo eso.
Lo que me interesa ahora es q me digan solo la idea de como podria hacer para cuando tengo un string = "2x-2(4+6)-2" lo pueda transformar a una ecuacion bien formada, es decir quedaria un string = "2x-22" si no me equivoco, ya q mi codigo si ingresan la ecuacion bien formada ax+b = 0 la realiza sin problemas, pero la idea es q lo pueda hacer con ecuaciones "informales"

Entienden mas o menos no? a esto lo puse en programacion general ya q solo quiero ideas, esque NO SE porq anduve pidiendo aca que me ayuden a separar en otras variables las cosas q estaban entre parentesis, pero ahora me di cuenta q no se si eso me servira :S

A ver si alguien me puede ayudar ahi, le agradeceria y cualkier aporte sirve, solo acuerdense q solo pido que cuando tenga un string = "2x-2(4+6)-2" lo pueda transformar a una ecuacion bien formada, es decir quedaria un string = "2x-22"

Desde ya Gracias!

Akai

#1
Creo que el planteamiento de ponerlo usando strings te está limitando.

Y si lees únicamente números y guardas el resultado en un vector?

ejemplo:

3x^3 +2x^2 -x +1 = 5 --> 3, 2, -1, 1 ,5  --> Para la forma "bien formada" que te interesa, simplemente sumas/restas el último al penúltimo. Resultado:

3x^3 +2x^2 -x -4 = 0 --> 3, 2, -1, -4 (x^3, x^2, x^1, x^0).

Otro ejemplo:


6x^3 -4=1: --> 6, 0, 0 ,-4, 1 --> 6, 0, 0, -5

Todo el tema de ecuaciones en computación se trabaja con matrices SIN las letras.

Ejemplo:

3x+2y-z =1
2x-y +z =2
x -y -z =5

resultado:

3 2 -1 1
2 -1 1 2
1 -1 -1 5

Edu

Gracias akai! veo q tienes la idea bien clara, yo usaba string porq mi ecuacion pasa por unos procedimientos de filtros para detectar algunos errores, pero puedo convertirla a otro tipo luego entonces y hacer eso q dices aunque todavia no se me ocurre mucho como hacerlo pero creo q te entendi.
Una cosa aca cuando pusiste:
Citar3x^3 +2x^2 -x -4 = 5 --> 3, 2, -1, -4 (x^3, x^2, x^1, x^0).

Querias poner esto no?:
Citar3x^3 +2x^2 -x -4 = 0 --> 3, 2, -1, -4 (x^3, x^2, x^1, x^0).

Gracias, voy a ver si pienso un poco sino te pregunto alguna otra dudita q tengo ya q vs sabes C++ creo asique yo q lo estoy haciendo en C# algo te entendere

Akai

Si, quería poner eso, hice un copy paste del otro ejemplo y se me olvidó cambiarlo.

Para hacerlo de esta manera, es más simple de lo que parece si lees un vector de enteros o floats:

Para la ecuaciń: 9x^2 -x +6 = 0 lees: 9 -1 6 0, 4 enteros. Si el último es 0, sabes que está "bien formada", y operas directamente para resolverla, sino, restas al penúltimo el último, y ya la tienes bien formada.

Por otro lado, tienes que "obligar" a introducir siempre todos los grados de la variable, o el método puede fallar:

si te introducen: 9x^4 -100 =0 de la forma: 9 -100 0 , tu método podría tomarlo como 9x -1=0, y por tanto, el método falla.
La entrada correcta para este caso sería 9 0 0 0 -100 0 que si da como resultado la ecuación esperada

Creo que has comentado que el programa es para uso propio, así que en principio el tema de la entrada no debería ser mayor problema que concienciarte tu mismo de como funciona tu programa. Si por otor lado, necesitases que lo utilizase más gente, hay dos opciones:

a) Recalcar que el uso del programa es ESE y que de otra forma va a fallar.

b) leer como una cadena de caracteres ( "9x^4 -100 = 0" ) y luego, de la cadena, pasar a la forma vectorial.

Edu

Gracias!
Es para uso propio el programa si, porq me da verguenza darselo a un amigo, pero quiero igual saber como formar la ecuacion formal porq tal vez si hago la version 2 vendra con cosas para la otra matematica q hemos aprendido las Demostraciones por Inducion Completa, no se si sabes de eso, o te acuerdas, y ahi necesitare comparar terminos y la mejor forma seria hacer las cuentas, si no entiendes de q te hablo ni te preocupes.

Por ahora mi programa resuelve hasta 2do grado solamente, y un procedimiento indica si es completa o incompleta la ecuacion y de q forma es incompleta en el caso de la de 2do grado, asique eso ya lo tengo solucionado aunque talvez cuando lo haga para otros grados se me complicara pero vere.

Solo quisiera q me digas unas cositas de lo q dijiste:

1- Un vector es un array no? perdon por la pregunta estupida xD pero es por las dudas..
2- Dices q puedo multiplicar 4 * (x^2) en el lenguaje q programo? eso daria 4x^2 ?

edit: Ahora creo q entendi lo q me decias, y es solo para cuando estan formadas :/
Yo pensaba q cuando pusiste 3x^3 +2x^2 -x -4 = 0 --> 3, 2, -1, -4 (x^3, x^2, x^1, x^0). q hacias algo con lo q esta entre parentesis.

Akai

No, lo que está en paréntesis en :
Citar3x^3 +2x^2 -x -4 = 0 --> 3, 2, -1, -4 (x^3, x^2, x^1, x^0)
Era para indicar el grado de cada miembro.

Por otro lado, no me he fijado en que lenguaje programas, tampoco, digamos, me "importa". Te estoy hablando de detalles algorítmicos, de planteamiento. La implementación es cosa tuya

Vector --> array, si. Yo estoy acostumbrado a usar vector en vez de array, pero se ve que según la zona se usa más array que vector.

Sobre el tema de 4*(x^2), o x^(lo que sea), esto es tan simple como procesar la ecuación del final al principio (de términos de menor grado a mayor) de forma que en cada iteración incrementes el grado de la x multiplicándola. CUIDADO CON ESTO:

primera iteración: x^1 (cálculos etc etc etc) x= x*x --> x^2

segunda iteración: x^2 (cálculos etc etc etc) x= x*x --> x^4!!!!!!

tercera iteración x^3, pero resulta que tenemos x^4 (cálculos etc etc etc) x= x*x --> x^8 Y el error sigue y sigue

Has de llevar un control sobre eso. Con una variable auxiliar en la que guardes la x^a lo que sea, de forma que nunca pierdes el valor original de la x (o al revés, que en la auxiliar guardes la x, y en x original la potencia)

Edu

Mmmm no te entiendo mucho, en si lo q pido es q me digan como podria hacer una funcion que haga esto:


2x-4(3x+7-2x)+5=0   ---> entrada

2x-4(1x+7)+5=0

2x-4x-28+5=0

2x-4x-23=0

-2x-23=0   ---> salida

-----------------------

4x-7x(3+2(5x-6)-8)-5+10x=0   ---> entrada

4x-7x(3+10x-12-8)-5+10x=0

4x-21x-70x^2+84x+56-5+10x=0

4x-21x-70x^2+84x+51+10x=0

-17x-70x^2+94x+51=0

-70x^2+77x+51=0   ---> salida


Ahi dejo 2 ejemplos q los hice mentalmente aca asique puede q esten mal, pero es para mostrar la idea por lo menos.
Esque pienso q estas pensando mas "avanzado" Akai y talvez es algo mas simple lo q pido

Akai

Vale, entendí el problema MAL desde el principio.

Visto eso, lo primero que se me ocurre, es:

Lees como cadena de caracteres.

Cuando detectes un paréntesis, copias (por ejemplo), en otra cadena, desde el siguiente símbolo al que abre paréntesis ' ( ' hasta el anterior al que cierra el paréntesis ' ) ' Y procesas esa parte (la simplificas (ahora explicaré el proceso de simplificar)). Una vez tienes la cadena sin paréntesis y con los términos que lo estaban multiplicados y demás, simplificas esa cadena,

Simplificar: una idea puede ser declarar un vector de (por ejemplo) 10 posiciones. Asumiendo entonces que tu programa podrá resolver desde grado 0 a grado 9.

Todas las posiciones inicializadas a 0.

Cada vez que detectes un elemento, sumas su valor al grado que corresponda(detectas un número? miras adelante para ver el grado ). Si detectas un igual, a partir del igual, todo irá con el signo cambiado.

Ejemplo:
ecuación muestra lo que queda por delante de la posición actual del indice de la cadena
inicio:
vector= 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

ecuación: -3x +4x^3 -5x^4 -2x^2 +x -4 = 5


primera iteración:

vector= 0, 0, 0, 0, 0, 0, 0, 0, -3, 0

ecuación: 4x^3 -5x^4 -2x^2 +x -4 = 5


segunda iteración:

vector= 0, 0, 0, 0, 0, 0, 4, 0, -3, 0

ecuación: -5x^4 -2x^2 +x -4 = 5


tercera iteración:

vector= 0, 0, 0, 0, 0, -5, 4, 0, -3, 0

ecuación: -2x^2 +x -4 = 5


cuarta iteración:

vector= 0, 0, 0, 0, 0, -5, 4, -2, -2, 0 // +1 a x con grado 1

ecuación: -4 = 5


quinta iteración:

vector= 0, 0, 0, 0, 0, -5, 4, 0, -3, -4

ecuación: = 5


sexta iteración:

vector= 0, 0, 0, 0, 0, -5, 4, 0, -3, -9 // -4 -5 ya que tomamos el 5 como negativo

ecuación: vacia

Ahora supongamos que en realidad esta ecuación estaba dentro de un paréntesis. En ese caso, multiplicamos cada elemento del vector por dicho valor (si aumenta el grado de la x, se desplazan los elementos una posición en el vector).

Por ejemplo:
7 ( lo anterior) multiplicamos todos por 7.
7x (lo anterior) multiplicamos todos por 7, y los movemos para aumentar el grado

Para el vector anterior, el caso con 7x quedaría algo así:
vector= 0, 0, 0, 0, 0, -5, 4, 0, -3, -9 //antes
vector= 0, 0, 0, 0, -35, 28, 0, -21, -63, 0 //después

Espero haber ayudado.

Edu

Gracias Akai! se me han ocurrido varias ideas, intentare y luego te digo como me fue, aunque durare 2 dias mas o menos xD

Edu

Bueno no he ni empezado si quiera, se me hace dificil pensarlo, pero es una lastima porq el programa esta de 10, esta bien organizado y bien codeado pienso, y solo me falta esta parte q seria lo mas dificil, desp lo otro ya lo hace todo y hara mas cosas. Tengo hasta junio para hacerlo porq me gustaria estudiar con el para las pruebas semestrales q tengo.
Asique necesito ayuda por favor, si alguien puede hacerme la funcion para formar la ecuacion bien organizada como pido, le agradezco