Autor Tema: ¿Cómo averiguar una relación entre X e Y?

0 Usuarios y 1 Visitante están viendo este tema.

11 Septiembre, 2016, 10:17 am
Leído 4080 veces

Tachikomaia

  • $$\Large \color{red}\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 208
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Edit:
Creo que me confundí, no necesito esto, necesitaría un programa que haga códigos que al ejecutarse logren la relación, o sea, simplemente obtener la relación no me sirve.


Hace años intenté hacer un programa que averiguara una relación entre X e Y, habiendo descrito ciertos X e Y...
Ejemplo:
X___Y
1___2
2___3
Una relación: Y = X+1
...dejé el proyecto cuando me enteré de un programa llamado Eureka - Formulize, que lo hace. Sin embargo ahora quiero hacerlo por motivos que no pueden satisfacerse usando Eureka, y quiero agregar algunas cosas también (ejemplo: Contar la cantidad de "1"s que tiene el número), y se me complica así que quiero pedirles ayuda. La pregunta es, dada una estructura como la que mencioné (o más larga) ¿cómo averiguar una relación que sirva para dicha estructura?

Tengo esta idea:
Si todo X es igual a todo Y, entonces Y=X
Sino...
Si Y-X siempre da el mismo resultado (R), entonces Y=X+R
Sino...
Si Y/X siempre da el mismo resultado (R), entonces Y=X*R
Sino...

Ahora quisiera hacer algo así para relaciones de tipo Y=X^R, supongo que sería:
Si haciendo raíces cuadradas a X se llega hasta Y en todo caso, y en todo caso requiere la misma cantidad (C) de raíces cuadradas, entonces Y=X^C
...pero bueno, no sólo me hace falta la función en programación para que se haga eso (es offtopic, pero lo menciono por si alguien lo sabe), sino que además no sé hacer operaciones como X^C cuando C es negativo y/o decimal. Me han dicho que se hace raíces cuadradas pero no lo entendí bien.

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

Sobre otro método (2).

Sería más digamos de búsqueda por fuera bruta, pero como me da la sensación de que la búsqueda sería demasiado larga estoy pensando en agregar un poco de deducción, pero parece llevame al método anterior...

Ejemplo (sin deducciones):
Probar X+1
Si falla, probar X+2 Si falla, probar X*2 ... X^2
... (X+1)*2 ... (X+1)^2
etc

1 operación, usando el número 1.
1 operación, usando el número 2.
2 operaciones, usando 1 y 2.
1 operación, usando el número 3.
2 operaciones, usando 2 y 1.
3 operaciones, usando 1, 2 y 2.
etc
o algo más simple si eso me resulta complicado.

También es que poner algo de razonamiento es necesario, porque en los ejemplos he estado salteando casos de números decimales, que podrían ser lo que se busca.

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

Sobre otro método (3).

Se me acaba de ocurrir, ir agregando operaciones cada vez que falla, ejemplo:
Probar Y=X
Si falla, probar agregarle +A o *A o ^A
... +B o ()*B o ()^B
Crear otra relación (2), usando la 2nda línea, con un A diferente.
etc
Nota: () significa meter entre paréntesis a lo que había.
Nota2: Ciertas combinaciones no se harían, por ejemplo X+A+B

Relación 1 tiene 0 operaciones
Relación 1 tiene 1 operación
Relación 1 tiene 2 operaciones
Relación 2 tiene 1 operación
Relación 1 tiene 3 operaciones
Relación 2 tiene 2 operaciones
Relación 3 tiene 1 operación
etc

La ventaja que me parece posible que tenga es que sería más fácil de hacer, no requeriría razonamientos. La desventaja seguiría siendo más o menos la misma, quizá un poco menos, y que la ecuación se volvería muy larga, pero se podría poner algunos "razonamientos" para intentar simplificarla.

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

Sobre otro método (4).

Te escucho.

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

Gracias.

11 Septiembre, 2016, 12:32 pm
Respuesta #1

feriva

  • $$\Large \color{red}\pi\,\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 9,171
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino
Hola, Tachicomaia.

Imagino que lo quieres hacer en actioscript, para Flash, pero  hace algunos años que no programo nada en Flash y, cuando lo he hecho, han sido cosas cortas. Sin embargo, sí sé que se puede hacer lo que dices, todo es cuestión de buscar cómo se escriben los comandos que necesitas; además la variación entre Actionscript y Java es pequeña, si no se encuentra en el tutorial de Macromedia se encuentra por otro lado.

Lo que te entiendo es esto:

Si X=Y, pues eso, Y=X, ahí no hay no creo que haya problema.

Si no, Y-X se cambia por un valor constante; tampoco hay gran problema, en Actionscript tienes “else” para después del “if”, y en ese caso le puedes decir que asigne la constante que tengas guardada en un array o en una letra o donde sea.

Lo mismo con Y/X:

Para calcular potencias, lo mismo pero con el comando necesario. En Flash tienes la orden “pow (x: número, y número) que calcula \( x^y \)

Aquí tienes una lista resumida de las funciones matemáticas que puedes usar en Actionscript.

http://help.adobe.com/es_ES/as2/reference/flashlite/WS5b3ccc516d4fbf351e63e3d118ccf9c47f-7d14.html

Cuando tienes un valor elevado a una potencia negativa, la puedes representar como una fracción:

\( a^{-3}=1/( pow (x: a, y: 3)  ) \)

es decir, 1 partido del número elevado a la potencia positiva.

Si un número está elevado a una potencia que es un número con decimales, ese número se puede escribir como un número elevado a una fracción; ejemplo:

Potencia: \( 2,34= \dfrac {234}{100} \)


Y, entonces, siempre podrás escribir esos números de esta forma

\( a^{\dfrac {b}{c}} \)

Eso mismo equivale a esto

\( (a^b)^{1/(c)} \)

sólo es pasarlo a lenguaje de programación según el lenguaje que se use.

En cuanto a lo que sigue es cuestión de condicionales, “if”, bucles y arrays, y de pensar cómo organizarse. Puedes buscar vídeos en Youtube que expliquen programas hechos en Javascript (hay muchos) y luego pasar la idea a Actioscript haciendo las variaciones necesarias en el código, que serán muy pocas.

Aquí te pongo uno de los vídeos que hay en uno de los muchos cursos; éste está bastante bien, es bastante completo.

https://www.youtube.com/watch?v=f1lChB4D890

Saludos.

13 Septiembre, 2016, 04:09 am
Respuesta #2

Tachikomaia

  • $$\Large \color{red}\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 208
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Creo que me confundí, no necesito esto, necesitaría un programa que haga códigos que al ejecutarse logren la relación, o sea, simplemente obtener la relación no me sirve.

Creo que está relacionado con esto:
https://es.wikipedia.org/wiki/An%C3%A1lisis_num%C3%A9rico#C.C3.A1lculo_de_los_valores_de_una_funci.C3.B3n

feriva
El lenguaje de programación a usar y demás es relevante porque si no tiene alguna función que se necesite entonces el trabajo hecho en dicho lenguaje puede resultar prácticamente en vano. Pero en general todos los lenguajes tienen todo lo necesario, así que no me preocuparía mucho por eso.
Lo que mostré era un pseudocódigo, para hacerlo en código tendría que usar do while o goto, entre otras cosas que no eran el motivo de mi consulta. Lo que me complica es que no sé hacer 8^0.4 por ejemplo. Y que los métodos, más allá de cómo los convierta en código, tienen defectos bastante grandes por el tema de que hay que escribir condiciones eternamente o que la búsqueda puede ser eterna. Me han recomendado programación genética que pienso podría ayudar, y se me ocurrió medir la complejidad de la relación, pero no sé si eso es posible. Sé que existe el llamado "grado de la función" o ecuación, probablemente sea eso sin más, aún no lo pensé.

Cuando tienes un valor elevado a una potencia negativa, la puedes representar como una fracción:

\( a^{-3}=1/( pow (x: a, y: 3)  ) \)
Si tengo a^b y b es negativo entonces tengo 1/(a^abs(b)) ?
Donde abs(b) es b sin su signo negativo.

It's ok?

El caso de los decimales no lo entendí. Si tengo por ejemplo 2^3,4 ¿cómo hago?

13 Septiembre, 2016, 07:51 am
Respuesta #3

feriva

  • $$\Large \color{red}\pi\,\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 9,171
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino


Hola. En cálculo numérico no estoy muy puesto, como en tantas cosas, pero lo de las potencias y la precisión no es mucho problema, a no ser que quieres una precisión de muchos cientos de decimales.

Citar
Lo que me complica es que no sé hacer 8^0.4 por ejemplo. Y que los métodos, más allá de cómo los convierta en código, tienen defectos bastante grandes por el tema de que hay que escribir condiciones eternamente o que la búsqueda puede ser eterna.

Yo ahora, si quiero programar alguna cosilla, lo que utilizo es Python, los otros lenguajes que conozco un poco los tengo medio olvidados. Obtener números como los que dices, o buscarlos a partir de un algoritmo que se programe, no es difícil siempre y cuando, ya te digo, no quieres una precisión de unos cuantos cientos de decimales.

Por ejemplo, en Python, podemos hacer este sencillo código utilizando la librería Sympy para obtener más precisión (que se descarga aparte):


 a=8.0 ** 0.4
 
Así de fácil es el comando para elevar un número a una potencia, la que sea, con el símbolo asterisco dos veces. En la versión Python 2, si quieres que sea float, no entero, se puede poner simplemente añadiendo un punto y cero detrás de algún número o usando el comando float; el resultado estándar es éste 2.29739670999407

Si lo quieres con más precisión, con el módulo sympy existe este comando, el cual podría venir a continuación del otro:

 a=Float (a,50)   La mayúscula lo distingue de la función habitual “float” y toma 50 decimales


2.2973967099940701963589617662364616990089416503906

Si el número lo quisieras con 100, 200 dígitos... o algo más, también te lo da, pero llega un momento en que, si la cantidad es muy grande, no puede o tarda mucho en hacer las operaciones con esos números.

Aquí puedes probar en el línea el Python para algunas cosas (incluso hacer pequeños programas)

http://www.sympygamma.com/input/?i=8%5E0.40

para programar en línea y probarlo, puedes ir aquí:

http://live.sympy.org/

se escribe el código debajo, donde tienes esto >>> que es como empieza cada rutina si se ejecuta directamente en consola.

Ahora bien, otra cosa es qué es exactamente lo que quieres que haga el programa, porque con el pseudocódigo sólo me entero hasta cierto punto; tendrías que poner algunos valores y en función de qué, en concreto, quieres que busque esos valores el ordenador, para ver si yo o alguien sabe de algo que pueda ayudarte.

Otra cosa, que ayer se me olvidó. También con Python puedes contar la cantidad de unos que tiene un número, o cualquier cifra; sólo hay que programar una pequeña rutina:

Por ejemplo, tomo ese número largo, y hago un programa que me escriba un 1 cada vez que encuentra un 1


>>> s= str (a)
>>> for j in range (len(s)):
...     if s[j]=="1":
...             print "1"
...
1
1
1
1

igualmente puede hacer que los cuente, guardarlos en una variable, etc., no se tarda nada en programar, es muy simple.

Y muchas más cosas, como ir tomando un cifra, dos cifras... las que sea, e ir convirtiendo a cadenas y luego a enteros, invertir las cifras del número, meter comas, puntos o lo que quieras, entre medias de cada cifra... Y se aprende muy deprisa a programar en Pithon; creo que te gustaría, a todo el mundo que lo prueba le gusta.

Saludos.

13 Septiembre, 2016, 09:07 am
Respuesta #4

sugata

  • $$\Large \color{red}\pi\,\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 2,666
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino
Lo que te comenta Feriva, con el ejemplo que has puesto.
\( 2^{3,4}=2^{\displaystyle\frac{34}{10}=(2^34)^{\displaystyle\frac{1}{10}} \)

Editado por fallo mío al escribir latex

13 Septiembre, 2016, 11:48 am
Respuesta #5

Luis Fuentes

  • el_manco
  • Administrador
  • Mensajes: 47,123
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
Hola

 Tachikomaia Lo que entiendo que quiere es a partir de una tabla de valores que realcionan dos variable \( X \) e \( Y \) obtener una fórmula que te permita calcular \( Y \) en función de \( X \).

 La cuestión es que dado un número finito de valores hay infinitas funciones que van a ser válidas. Normalmente uno tiene alguna idea previa sobre que tipo de función le interesa usar para interpolar esos datos, y a partir de ahí utiliza el correspondiente método para conseguirlo.

 Este tipo de cuestiones se llaman problemas de interpolación.

 Puedes leer sobre el asunto por aquí:

https://es.wikipedia.org/wiki/Interpolaci%C3%B3n

Saludos.

14 Septiembre, 2016, 12:01 pm
Respuesta #6

feriva

  • $$\Large \color{red}\pi\,\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 9,171
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino

Hola, Tachikomaia.

Citar

Edit: Creo que me confundí, no necesito esto, necesitaría un programa que haga códigos que al ejecutarse logren la relación, o sea, simplemente obtener la relación no me sirve.


En ese caso entiendo que era lo que ya había supuesto el_manco.

Bien, si pones en Youtube “programar polinomio interpolador” encontrarás vídeos donde viene cómo hacerlo para lenguaje “C” y también para MatLab.

Si prefieres programarlo tú, y no conoces esos lenguajes o no tienes MatLab, yo te sigo recomendando Python; para esto y para otras cosas que quieras hacer en el futuro.

He estado mirando y un método que puede ser muy adaptable a la programación es el que utiliza un sistema de ecuaciones lineales, en el que sale una matriz de Vandermonde, de la cual es fácil hallar su determinante y, por tanto, es fácil la resolución del sistema.

Para empezar, este método es muy “visible”, sabemos bien lo que estamos haciendo porque todo el mundo entiende el funcionamiento de un sistema de ecuaciones lineales, mientras que los otros métodos, si no se conoce la demostración, se utilizan como meras recetas; y si la rutina no corre al ir programando, quizá sea más difícil buscar el fallo (es de suponer, por simple lógica, no lo he programado nunca).

De hecho, existe para Python una librería muy usada, que se llama Numpy (la puedes descargar en muchos sitios de Internet), con la que es muy fácil la resolución de un sistema de ecuaciones (sólo hay que escribir las matrices, prácticamente no hay que hacer más) te dejo aquí un vídeo:

https://www.youtube.com/watch?v=rCD1E4KYOIo

También habrá cosas parecidas para otros lenguajes, puedes buscar; y, por ejemplo, en línea, tienes el famoso WolframAlpha

http://www.wolframalpha.com/

Si quieres que este programa te resuelva un sistema, sólo tienes que poner en el visor, en la cajita donde se escribe, las ecuaciones separadas por una coma:

2x+3y=10, x-y=4

Las que sean, con las variables que sean.

En el caso que tu quieres, la cuestión teórica es que tienes un valor “y” que depende de un valor “x”, de forma que “y” puede aproximarse a un valor racional; entonces ese valor se puede escribir como un polinomio, como una suma de valores en función de “x”.

Si tienes, con un ejemplo, cuatro parejas de valores (x,y), el polinomio será de grado 3 (ahora se va a ver por qué es un grado menos):

supón que una pareja pudiera ser “x=2; y=5”; entonces, por lo dicho, existe esto:

\( y=ax^{3}+bx^{2}+cx+d
  \) polinomio de grado 3

que para esa pareja, sustituyendo, es

\( 5=a\cdot2^{3}+b\cdot2^{2}+c\cdot2+d
  \)

El polinomio es de grado 3, máxima potencia, pero tenemos que hallar cuatro incógnitas, que son “a,b,c,d”, así que necesitamos conocer cuatro parejas para tener cuatro ecuaciones como ésa, tantas ecuaciones como incógnitas.

Una vez que tienes las soluciones para a,b,c,d, pues ya tienes la fórmula que sirve par hallar, de forma aproximada, cualquier “y” tomando un valor numérico para “x”. Así pues, simplemente sustituyendo aquí \( y=ax^{3}+bx^{2}+cx+d
  \) los valores que hayas obtenido para cada letra, obtienes una fórmula que relaciona “x” e “y”.

Saludos.

23 Septiembre, 2016, 02:50 am
Respuesta #7

Tachikomaia

  • $$\Large \color{red}\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 208
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
la precisión no es mucho problema
En mi Flash según recuerdo 0.01 + 0.01 puede dar 0.019999... Entonces, no sé, pero si no puede sumar bien con decimlaes entonces supongo tampoco otras operaciones con ellos.

Citar
a=8.0 ** 0.4
Ok. Mi Flash tiene una función para eso, creo que funciona. Mi preocupación era también porque a nivel manual digamos no sé hacerlo.

Citar
con el pseudocódigo sólo me entero hasta cierto punto; tendrías que poner algunos valores y en función de qué, en concreto, quieres que busque esos valores el ordenador, para ver si yo o alguien sabe de algo que pueda ayudarte.
En principio digamos que quiero imitar al programa Eureqa.
https://www.youtube.com/watch?v=NhC1Qb-PQ5Q
Dudo que viendo ese video lo entiendas más que leyendo lo que dije, pero no parece haber explicaciones en español, sintetizadas y ese tipo de cosas.

Digamos, dada una gráfica, encontrar alguna función que la describa. Es el proceso inverso al que enseñan en los primeros años de Matemática. Te dan la función y tú haces la gráfica. Lo que yo quiero es al revés.

Citar
Otra cosa, que ayer se me olvidó. También con Python puedes contar la cantidad de unos que tiene un número, o cualquier cifra; sólo hay que programar una pequeña rutina:

Por ejemplo, tomo ese número largo, y hago un programa que me escriba un 1 cada vez que encuentra un 1


>>> s= str (a)
>>> for j in range (len(s)):
...     if s[j]=="1":
...             print "1"
...
1
1
1
1

igualmente puede hacer que los cuente, guardarlos en una variable, etc., no se tarda nada en programar, es muy simple.
Ese tipo de cosas son las que quiero evitar hacer y en eso consistiría el siguiente paso del programa, o el post-siguiente, no lo tengo del todo claro: Que esos códigos los genere él.

No he podido describirlo bien pero es más o menos así:
Citar
"Dale al hombre pescado, y comerá un día.
Dale el método para pescar, y comerá toda su vida.
Dale el método para obtener métodos, y ya no tendrás que darle más.

Suponte que tienes un programa que te saluda de una u otra forma según el clima (esto es un ejemplo tonto, pero bue).
Dile cómo está el clima hoy, y te saludará acordemente hoy.
Dile cómo saber el cima cada día, y te saludará acordemente cada día del resto de tu vida.
Dile cómo averiguar lo que tú le dirías para cualquier otra función que quieres que cumpla, y ya no tendrás que decírselo."

Dices que es fácil y rápido generarlos uno mismo pero para mí no lo fue:
http://zonaforo.meristation.com/topic/2395249/

http://tachikomaia.blogspot.com.uy/2016/08/correccion-de-contar-conjuntos-v.html

Encima creo que me faltan cosas, no sé, por ahora no estoy pensando en eso. Además, luego tendría que hacer códigos para contar la simetría (hay 2 tipos), el "orden":
http://sofosagora.net/ciencia-general/como-medir-orden-teg-t7390.html
Nota: TEG es un usuario que estudia cosas relacionadas con el orden, pero no sé mucho, precisamente el tema que te mostré lo hice para ver si se puede formalizar un poco su idea o no.

Y posiblemente contar otras cosas que no se me ocurrieron. Y luego contar cosas en palabras (no en números), respecto a lo cual no he pensado (a lo mejor no cambia mucho, pero en fin), y de archivos, y no sé qué más.

Pero bueno, uds concéntrense en describir un método para averiguar relaciones entre datos X e Y. Gracias.

23 Septiembre, 2016, 11:45 am
Respuesta #8

feriva

  • $$\Large \color{red}\pi\,\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 9,171
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino


Digamos, dada una gráfica, encontrar alguna función que la describa. Es el proceso inverso al que enseñan en los primeros años de Matemática. Te dan la función y tú haces la gráfica. Lo que yo quiero es al revés.

Pues eso es lo que te dijo el_manco, el polinomio interpolador, y que lo puedes hacer como te dije, con un simple sistema de ecuaciones lineales, igualando cada f(x) que tengas al polinomio para los valores "x" que tengas, creando así un sistema compatible determinado (luego había otra cosa que se hacía por regresión lineal, algo que se llamaba, me parece, mínimos cuadrados, y se podían usar logaritmos o derivadas, pero lo hice sólo una vez en mi vida y no me acuerdo bien).

Saludos.

24 Septiembre, 2016, 08:22 pm
Respuesta #9

Tachikomaia

  • $$\Large \color{red}\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 208
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Lo que te comenta Feriva, con el ejemplo que has puesto.
\( 2^{3,4}=2^{\displaystyle\frac{34}{10}=(2^34)^{\displaystyle\frac{1}{10}} \)

Editado por fallo mío al escribir latex

No sé qué es eso.

Este tipo de cuestiones se llaman problemas de interpolación.
Ok. Por lo que he leído también necesito extrapolar.
http://pendientedemigracion.ucm.es/info/sevipres/P4/01/ANEXOS01.php
Pero creo que no importa, sólo que el método de interpolación lineal no me serviría.

Citar
Se trata de determinar fundamentalmente dos cosas:

1. Los datos  que se desea que sean comunes a la función desconocida y a la función interpoladora.

2. Que tipo de función se va a utilizar como función interpoladora o función de interpolación.
No sé a qué tipos se refiere el punto 2, tú dices lo mismo o algo similar, pero creo que me da igual qué tipo sea... O, si es desconocido ¿cómo se averigua?

Estoy leyendo "I.2.1.1. Método matricial" y no estoy entendiendo desde donde dice:
"las condiciones impuestas determinan que los coeficientes deben verificar: "

Debo irme.

En la definición de polinomio aquí
https://es.wikipedia.org/wiki/Polinomio
dice
"(...) utilizando únicamente las operaciones aritméticas de suma, resta y multiplicación, así como también exponentes enteros positivos"
¿Qué pasa si la función tiene un exponente negativo y/o decimal? ¿es sustituíble por otra? De hecho estuve pensando que los números decimales son obtenibles mediante divisiones y que las multiplicaciones eran necesarias. Teniendo en cuenta eso, un método de "ir haciendo todas las combinaciones posibles" sería más sencillo.