Discussion:
ecuaciones e incognitas en VB
(demasiado antiguo para responder)
Ivan
2008-06-26 01:02:16 UTC
Permalink
hola a todos,

a vueltas con las ecuaciones:

¿sabeis si esxiste alguna forma, libreria, complemento o lo que sea
que permita desarrollar ecuaciones en el IDE +/- como lo hariamos
sobre papel?

es decir, que nos permita mantener unas variables como incognitas
'reales' hata el momento en que se lo asignemos en la resolucion de la
ecuacion, sin que les asigne un valor por defecto echando al traste
todo el desarrollo de la ecuacion

se trataria de la tipica 'x' e 'y' de por ej. una ecuacion de 1er o 2º
grado, o de un sistema de ecuaciones

creo que asi planteado probablemente no sea posible, pero lo dicho, lo
mismo existe algun complemento, APi o algun truco que permita obtener
el resultado de una ecuacion de dicho tipo

si podeis echarme un cable una vez mas os lo agradezco

un saludo
Ivan
SergioT
2008-06-26 13:37:19 UTC
Permalink
hola

haber no llego a entender que quieres, quieres hacer que el programa te
resuelva un sistema de ecuaciones de 2 incognitas mostrandote el
procedimiento??? o quieres ingresar la ecuacion y que el sisteme te haga los
remplazaos y resuelva el sistema mostrandote el resultado?

si son esas las opciones que quieres está dificil de conseguir, no creo que
haya ninguna libreria vas a tener que desempolvar tus libros de algebra y
obtener un mecanismo que lo coloques como formula, por ejemplo puedes usar
el método de sustitución y tendrás que hacer todo un programa que interprete
y despeje ecuaciones, en un trabajito bien interesante pero la verdad que
Apis no creo que hayan, lo dudo mucho, talvez alguna librería de terceros.


salu2
SergioT
Post by Ivan
hola a todos,
¿sabeis si esxiste alguna forma, libreria, complemento o lo que sea
que permita desarrollar ecuaciones en el IDE +/- como lo hariamos
sobre papel?
es decir, que nos permita mantener unas variables como incognitas
'reales' hata el momento en que se lo asignemos en la resolucion de la
ecuacion, sin que les asigne un valor por defecto echando al traste
todo el desarrollo de la ecuacion
se trataria de la tipica 'x' e 'y' de por ej. una ecuacion de 1er o 2º
grado, o de un sistema de ecuaciones
creo que asi planteado probablemente no sea posible, pero lo dicho, lo
mismo existe algun complemento, APi o algun truco que permita obtener
el resultado de una ecuacion de dicho tipo
si podeis echarme un cable una vez mas os lo agradezco
un saludo
Ivan
Ivan
2008-06-26 15:42:16 UTC
Permalink
hola Sergio,

antes que nada muchas gracias por tu respuesta
Post by SergioT
Post by SergioT
quieres hacer que el programa te
resuelva un sistema de ecuaciones de 2 incognitas mostrandote el
procedimiento???
Post by SergioT
o quieres ingresar la ecuacion y que el sisteme te haga los
remplazaos y resuelva el sistema mostrandote el resultado?
en realidad, inicialmente y de cara a la aplicacion que quiero darle
me bastaria con la 2ª opcion, es decir obtener el/los resultados de
determinado sistema de ecuaciones

pero al empezar a practicar me ha ocurrido lo que a ti, que me ha
parecido muy interesante [ambas opciones],

y como al fin y al cabo, en mi caso, casi todo son 'experimentos' para
ir aprendiendo diferentes usos de VB Net, de momento he aparcado la
aplicacion para la que iba destinado (animacion de graficos), y me
estoy liando a ver si saco algo en claro

mis primeros tanteos me da la impresion de que mas o menos empiezan a
encaminarse hacia lo que tu comentas, sobre todo en lo referido a
'sustitucion' (aunque no estoy seguro que te refieras a lo mismo)

seguramente usando mucho lenguaje 'simbolico' y muy condicionado, se
pueda ir sacando algo. pero ni siquiera lo tengo claro, solo es un
'esbozo mental' 8-)


en lo que se refiere al uso practico, creo haber visto en algun lado
que existen programas especificos que si trabajan ecuaciones y similar
[¿matlab quizas?]

¿en caso de existir, sabes si hay forma de usar algo parecido a
automatizacion para mediante ellos obtener simplemente el resultado y
usarlo dentro de una aplicacion de VB Net?

supongo que en cualquier caso dependeria de cada programa y de que
hasta que punto admite dicha 'automatizacion', pero lo mismo hay algo
por ahí

lo dicho, muchas gracias, y si consigo avanzar algo en el terreno de
las ecuaciones ya comentare

un saludo
Iavn
SergioT
2008-06-26 19:22:57 UTC
Permalink
Hola

A lo que me refiero por sustitucion es al método aljebraico para resolver
sistemas de 2 ecuaciones con 2 incognitas que consiste basicamente en tomar
una de las 2 ecuaciones , despejar una variable y sustituir ese valor en la
otra ecuacion de forma que quedes con una ecuacion que tiene una sola
variable, luego en esta ultima despejas la variable que quedó y obtienes un
resultado numérico que vuelves a sustituir en la primera ecuación obteniendo
así el valor de la otra variable.

No conozco si programas como el mathlab permiten usar sus componentes para
una automatizacion, pero si no pienso que usando teoria de compiladores
podrias construir un automata que sea capàs de despejar ecuaciones que
despues puedas usar en la solución de ecuaciones, otra opción es la
aplicacion de métodos numéricos que son modelos matemáticos que te permiten
obtener un resultado sin el uso del algebra pura si no mas bien com
aproximaciones matemáticas, la verdad que ya caimos en un terreno que es mas
matemático que otra cosa, si haces algo con esto seria interesante que lo
puedas compartir

Nos vemos
Salu2
Sergio
Post by Ivan
hola Sergio,
antes que nada muchas gracias por tu respuesta
Post by SergioT
Post by SergioT
quieres hacer que el programa te
resuelva un sistema de ecuaciones de 2 incognitas mostrandote el
procedimiento???
Post by SergioT
o quieres ingresar la ecuacion y que el sisteme te haga los
remplazaos y resuelva el sistema mostrandote el resultado?
en realidad, inicialmente y de cara a la aplicacion que quiero darle
me bastaria con la 2ª opcion, es decir obtener el/los resultados de
determinado sistema de ecuaciones
pero al empezar a practicar me ha ocurrido lo que a ti, que me ha
parecido muy interesante [ambas opciones],
y como al fin y al cabo, en mi caso, casi todo son 'experimentos' para
ir aprendiendo diferentes usos de VB Net, de momento he aparcado la
aplicacion para la que iba destinado (animacion de graficos), y me
estoy liando a ver si saco algo en claro
mis primeros tanteos me da la impresion de que mas o menos empiezan a
encaminarse hacia lo que tu comentas, sobre todo en lo referido a
'sustitucion' (aunque no estoy seguro que te refieras a lo mismo)
seguramente usando mucho lenguaje 'simbolico' y muy condicionado, se
pueda ir sacando algo. pero ni siquiera lo tengo claro, solo es un
'esbozo mental' 8-)
en lo que se refiere al uso practico, creo haber visto en algun lado
que existen programas especificos que si trabajan ecuaciones y similar
[¿matlab quizas?]
¿en caso de existir, sabes si hay forma de usar algo parecido a
automatizacion para mediante ellos obtener simplemente el resultado y
usarlo dentro de una aplicacion de VB Net?
supongo que en cualquier caso dependeria de cada programa y de que
hasta que punto admite dicha 'automatizacion', pero lo mismo hay algo
por ahí
lo dicho, muchas gracias, y si consigo avanzar algo en el terreno de
las ecuaciones ya comentare
un saludo
Iavn
Ivan
2008-06-26 20:12:49 UTC
Permalink
hola Sergio,
A lo que me refiero por sustitucion es al método aljebraico....
disculpame pero se me ha ido la olla hacia lo retorcido en lugar de lo
evidente.


parece claro que esa parte es una fase importante si se quiere
desarrollar algo como lo que comentabamos, pero yo directamente habia
pensado que te referias a algun metodo de sustitucion de valores por
variables a lo largo del desarrollo del codigo (retorcidillo que es
uno, je, je,..)

aclarando lo primero que lo que voy a decir de momento es una especie
de especulacion mental que no acabo de estar seguro de si tiene
sentido y que mi nivel es tan bajo, que lo que haga seguramente sera a
partir de instrucciones muy basicas, [y dado que la unica manera de
'intentar' llegar a algun sitio es empezar a 'andar']

a lo que me referia con 'simbolico' y sustistucion era a algo asi como
ir trabajando al menos la parte de las incognitas en 'modo' texto, es
decir, pej. usando condicionales y atomizando aun mas las partes de la
ecuacion, al menos hasta que se llegue al momento en que se les
pudiera asignar un valor real

posiblemente conllevaria codigos con instrucciones bastante extensas
para cada paso pero no lo se y al menos voy a intentar ver si tiene
algo de sentido
No conozco si programas como el mathlab permiten usar sus componentes para
una automatizacion,
en este sentido, parece que el vinculo facilitado por Lluis contiene
algunas posibilidades (de momento estoy intentando ver cual se
adaptaria mejor a lo que busco, aunque las que he visto parecen ser de
pago y preferiria algo free [no esta la cosa para muchas alegrias, je,
je, :-) ], pero quizas se pueda extraer alguna idea)
Post by SergioT
pero si no pienso que usando teoria de compiladores
podrias construir un automata que sea capàs de despejar ecuaciones que
esta parte por desgracia creo que excede mis conocimientos, aunque
tomo nota para al menos intentar indagar un poco. Nunca sobraa...
Post by SergioT
, si haces algo con esto seria interesante que lo
puedas compartir
aunque no creo que sea capaz de llegar muy lejos, ten por seguro que
si consigo algo lo pondre por aqui, ya de paso para recabar opiniones,
correcciones etc...


bueno, disculpa el rollo y muchas gracias de nuevo por todos los
detalles

un saludo
Ivan
Lluis Franco
2008-06-26 15:22:50 UTC
Permalink
:-)
Hola Ivan
Existen muchos componentes que permiten parsear una expresión o ecuación,
por ejemplo:
http://www.componentsource.com/relevance/net-components/index-es.html?q=math

Saludos,
--
Lluís Franco i Montanyés
[MS-MVP-MCP Visual Basic]
--
NUG: http://andorradotnet.com
Web: http://sps.uyssoft.com
Blog: http://msmvps.com/blogs/lfranco
Geeks: http://geeks.ms/blogs/lfranco
--
(Guía de netiquette de los foros)
http://sps.uyssoft.com/Foros%20online/Netiquette.aspx
FIMARGE, S.A.
Principat d'Andorra
***@ODIO_EL_SPAMfimarge.ad
Tel.: +376 805 100
Fax: +376 824 500
--
Mi Perfil MVP en:
https://mvp.support.microsoft.com/profile/Lluis
--
This posting is provided "AS IS" with no warranties, and confers no rights.
Este mensaje se proporciona "COMO ESTA" sin garantias y no otorga ningun
derecho.
Ivan
2008-06-26 15:49:47 UTC
Permalink
hola Lluis,

http://www.componentsource.com/relevance/net-components/index-es.html...

acabo de ver tu respuesta tras enviarle una a Sergio. Muchas gracias
por el enlace. Estoy echandole un ojo y voy a ver por lo que me
decido.

de todas formas si parece un tema interesante en si mismo, al menos
para romperte la cabeza un poco , Je, je ..:-)

un saludo y gracias de nuevo
Ivan
Leonardo Azpurua
2008-06-27 00:43:59 UTC
Permalink
"Ivan" <***@gmail.com> escribi� en el mensaje news:9767ac24-65ed-4e0b-9b5a-***@34g2000hsh.googlegroups.com...

Hola, Ivan:

La verdad, vengo siguiendo el hilo desde anoche, y todavía no me entero de
qué es lo que quieres.

Si el problema es encontrar la solución a problemas que se presentan al
vuelo, basta con una función para cada tipo de ecuación, algo como por
ejemplo:

3x + 5 = 7

que es un caso de la forma general ax + b = c (ecuacion lineal de primer
grado), donde -despues de despejar- tenemos

x = (c - b) / a

Eso lo resuelves con:

Public Function EcuacionLineal(a As Double, b As Double, c As Double) As
Double
Return = (c - b) / a
End Function

o si tienes algo del tipo:

3x + y = 7
-4x + 3y = 12

Que tiene la forma general (ax + by = c; dx + ey = f): eso lo resuelves
mediante dos funciones:

Public Function ValorYLineal2(a As Double, b As Double, c As Double, d As
Double, e As Double, f As Double) As Double
Dim Factor, t1, t2, y As Double
Factor = -(a / d)
t1 = e * Factor
t2 = f * Factor
ValorYLineal = EcuacionLineal(t1, t2)
End Function

Public ValorXLineal(a As Double, b As Double, c As Double, d As Double, e As
Double, f As Double) As Double
Dim Y as Double = ValorYLineal(a, b, c, d, e, f)
Return EcuacionLineal(a, b * Y, c)
End Function

Pero sigo sin entender lo que necesitas.


Salud!
Leonardo Azpurua
2008-06-27 04:26:54 UTC
Permalink
"Leonardo Azpurua" <l e o n a r d o [arroba] m v p s [punto] o r g> escribió
Post by Leonardo Azpurua
La verdad, vengo siguiendo el hilo desde anoche, y todavía no me entero de
qué es lo que quieres.
Si el problema es encontrar la solución a problemas que se presentan al
vuelo, basta con una función para cada tipo de ecuación, algo como por
3x + 5 = 7
que es un caso de la forma general ax + b = c (ecuacion lineal de primer
grado), donde -despues de despejar- tenemos
x = (c - b) / a
Public Function EcuacionLineal(a As Double, b As Double, c As Double) As
Double
Return = (c - b) / a
End Function
3x + y = 7
-4x + 3y = 12
Que tiene la forma general (ax + by = c; dx + ey = f): eso lo resuelves
Public Function ValorYLineal2(a As Double, b As Double, c As Double, d As
Double, e As Double, f As Double) As Double
Dim Factor, t1, t2, y As Double
Factor = -(a / d)
t1 = e * Factor
t2 = f * Factor
ValorYLineal = EcuacionLineal(t1, t2)
End Function
Public ValorXLineal(a As Double, b As Double, c As Double, d As Double, e
As Double, f As Double) As Double
Dim Y as Double = ValorYLineal(a, b, c, d, e, f)
Return EcuacionLineal(a, b * Y, c)
End Function
Pero sigo sin entender lo que necesitas.
En caso de que fuera eso, estas son las funciones corregidas:


Public Function EcuacionLineal(a As Double, b As Double, c As Double) As
Double
Return (c - b) / a
End Function


Public Function ValorYLineal(a As Double, b As Double, c As Double, d As
Double, e As Double, f As Double) As Double
Dim Factor, t1, t2 As Double
Factor = -(a / d)
t1 = b + e * Factor
t2 = c + f * Factor
ValorYLineal = EcuacionLineal(t1, 0, t2)
End Function


Public Function ValorXLineal(a As Double, b As Double, c As Double, d As
Double, e As Double, f As Double) As Double
Dim Y as Double = ValorYLineal(a, b, c, d, e, f)
Return EcuacionLineal(a, b * Y, c)
End Function


Salud!
Ivan
2008-06-27 09:44:04 UTC
Permalink
hola Leonardo
Post by Leonardo Azpurua
La verdad, vengo siguiendo el hilo desde anoche, y todavía no me entero de
qué es lo que quieres.
Si el problema es encontrar la solución a problemas que se presentan al
vuelo, basta con una función para cada tipo de ecuación, algo como por
pues la verdad es que, a falta de probar/adaptar tus ejemplos, en
realidad si es algo asi a lo que me referia.

Pero como siempre, en vez de empezar por lo logico y evidente, he
vuelto a complicarme la vida a base de inecesarias vueltas ( ... a ver
si me mandan de una vez aquel libro... e intento racionalizarme un
pelin :-))

muchas gracias de nuevo y voy a echar un ojo a ver si van por ahi los
tiros (aunque intentare por otra parte practicar un poco la parte del
desarrollo 'visual' de ecuaciones solo por practicar y
entretenimiento)

un saludo
Ivan
Leonardo Azpurua
2008-06-27 11:49:44 UTC
Permalink
"Ivan" <***@gmail.com> escribi� en el mensaje news:f4ff6c03-f834-4f65-a988-***@z66g2000hsc.googlegroups.com...

hola Leonardo
Post by Leonardo Azpurua
La verdad, vengo siguiendo el hilo desde anoche, y todavía no me entero de
qué es lo que quieres.
Si el problema es encontrar la solución a problemas que se presentan al
vuelo, basta con una función para cada tipo de ecuación, algo como por
pues la verdad es que, a falta de probar/adaptar tus ejemplos, en
realidad si es algo asi a lo que me referia.
-----------------------


Hola, Ivan:

En ese caso, igual hay que aclararte que ValorYLineal te devuelve el valor
de la segunda incógnita en un sistema de dos ecuaciones lineales con dos
incognitas, del tipo

{ ax + by = c; dx + ey = f }

de ahi los nombres de los argumentos (a..f).

ValorXLineal te devuelve el valor de la primera incógnita.

Si el coeficiente de la primera incognita en la segunda ecuacion es cero, la
función falla.


Salud!
Ivan
2008-06-29 00:23:39 UTC
Permalink
hola Leonardo,

lo 1º disculpas por la tardanza, pero llevo un par de dias de perros [callejeros, no de esos de
chimenea ...] y no he podido meterle mano casi. Igualmente disculpas por la indefinicion en mi
consulta.

se trata de hallar los puntos de interseccion de 2 circunferencias secantes o tangentes

aunque es un rollo y te lo puedes saltar, te comento un 'poco' el motivo inicial de todo esto, [ que
ademas seguro que tiene formas mas 'propias' y directas de hacerlo, aunque como en el fondo no deja
de ser un ejercicio de 'indagacion', pues tampoco pasa mucho por seguir un poco ..]

'-----

estudiando un poco la manipulacion de graficos, imagenes, etc, en windows forms, me ha dado por
intentar 'animar' palitos/lineas. En este caso se trata de conseguir el efecto de una articulacion
(bueno seria de muchas, pero hecha una hechas todas, creo), por ej. un brazo

P0 o-------------------o P1
brazo \
\ antebrazo
\
o P2

.- para ello tendriamos 3 puntos:

hombro [P0], codo [P1] y muñeca [P2]

.- sobre los que girarian 2 segmentos:

brazo [P0->P1] y antebrazo [P1->P2]


.- el 1er segmento se correspoderia con el radio de la circunferencia con centro en el hombro (P0).
Este punto [en este movimiento] seria fijo.

.- el 2º segmento se corresponderia con el radio de la circunferencia con centro en el codo (P1), y
en este caso [y salvo que este escayolado :-)] evidentemente el punto/codo podria estar en cualquier
punto de la circunferencia con centro en el hombro

.- por ultimo este 2º segmento, o mejor dicho, el 3er punto (P2), correspondiente a la muñeca podria
moverse por cualquier punto del plano siempre y cuando su distancia al punto P1 siempre fuese la
misma [en realidad estariamos hablando de un contorsionista], es decir, que el segmento P1->P2
siempre estuviese unido al P0->P1 en el punto P1 y por supuesto mantteniendo las longitudes de ambos
segmentos

.- siendo asi, cualquier movimiento del punto P1 afectaria a la posicion de P2

.- y a la inversa, salvo que P2 se moviese por los puntos de la circunferencia con centro en P1
(codo) y radio P1->P2. De no ser asi, cualquier desplazamiento de la muñeca provocara el movimiento
del codo

en cualquier caso parece claro que la circunferencia con centro en el hombro (P0) y la que tendria
el centro en la muñeca (P2) y radio P1->P2 siempre tendrian que tener al menos un punto en comun
(P1), el cual podria ser:

a) el punto de tangencia en el caso de que ambas circunferencias fuesen tangentes (brazo estirado o
totalmente plegado)

b) uno de los 2 puntos de interseccion de las 2 circunferencias secantes que se formarian al plegar
el brazo en casi cualquier posicion/angulo

c) caso aparte seria para la misma longitud de brazo y antebrazo (las 2 circ. iguales)

'----------

en fin, que este seria el motivo causante de los desaguisados [tanto de programacion como de
matematicas] que expongo a continuacion

volviendo a tus ej. he hecho esta adaptacion un tanto libre de tus funciones para obtener los
resultados de una ecuacion de 2º grado:


' Para ecuacion de 2º grado que puede ser:
' completa [a^2 + bx + c = 0] o incompleta
' en sus 2 versiones [a^2 + bx = 0] o [a^2 + c = 0]
' En cualquier caso, el coeficiente que falte hay que
' pasarselo como 0 y en su posicion.
' Basada en funciones de Leonardo Azpurua
' [27/06/08]
'
Public Function Ecuacion2doGrado( _
ByVal a As Double, _
ByVal b As Double, _
ByVal c As Double) As Double()
'
Dim x1, x2 As Double
'
If a = 0 Then
MsgBox("La ecuacion no es de 2º grado.")
Return Nothing
ElseIf b = 0 Then
If c = 0 Then
' esta solucion me la estoy inventando a falta
' de repasar un poco de mates. Sorry ...
'
x1 = Sqrt(1 / a)
x2 = -(Sqrt(1 / a))
Else
x1 = Sqrt(-c / a)
x2 = -(Sqrt(-c / a))
End If
ElseIf c = 0 Then
x1 = 0
x2 = -b / a
Else
x1 = ((-b) + Sqrt((b ^ 2) - (4 * a * c))) / (2 * a)
x2 = ((-b) - Sqrt((b ^ 2) - (4 * a * c))) / (2 * a)
End If
Dim xs() As Double = {x1, x2}
Return xs
End Function

y esta seria una prueba, aun a medias, para obtener, por un lado los puntos de interseccion de dos
circunferencias secantes, y por otro un string con el desarrollo y las explicaciones mas o menos
completas de todos los pasos con sus formas y valores en cada paso

seguramente es muy mejorable y haya mas de una burrada (hacia mas de 20 años que no tocaba apenas
las mates, y eso se nota en la neurona ..), aparte de que como digo aun esta incompleto, pero que
mas o menos se ve por donde va

(disculpas por la extension del codigo, pero la mayoria se debe al string con la explicacion, que al
fin y al cabo sirven a la vez para comentar el codigo. Tambien esta un poco estirado aposta para
dejarlo un poco mas claro visualmente.

Public Function Circsecantes( _
ByVal P1 As PointF, _
ByVal P2 As PointF, _
ByVal R1 As Double, _
ByVal R2 As Double, _
ByRef msj As String) As PointF()

msj = "Problema:" & vbCrLf & vbCrLf & _
"Hallar puntos de intersección de dos circunferencias" _
& vbCrLf & "secantes teniendo sus centros y sus radios."
'
msj = msj & vbCrLf & vbCrLf & _
".Circunferencia 1:" & vbCrLf & _
" Centro = " & P1.ToString & vbCrLf & _
" Radio = " & R1 & vbCrLf & _
".Circunferencia 2:" & vbCrLf & _
" Centro = " & P2.ToString & vbCrLf & _
" Radio = " & R2
'
msj = msj & vbCrLf & vbCrLf & _
".Ecuaciones de las circunferencias:"
'
msj = msj & vbCrLf & " 1ª) " & _
"(x - " & P1.X & ") ^ 2 + (y - " & _
P1.Y & ") ^ 2 = " & (R1 ^ 2)
'
msj = msj & vbCrLf & vbCrLf & _
" 2ª) (x - " & P2.X & ") ^ 2 + (y - " & P2.Y & _
") ^ 2 = " & (R2 ^ 2)
'
msj = msj & vbCrLf & vbCrLf & _
".Tras desarrollar y restar ambas ecuaciones" & vbCrLf & _
"obtenemos la siguiente ecuacion lineal:"
'
msj = msj & vbCrLf & vbCrLf & " " & _
(2 * (P1.X - P2.X)) & " * x + " & _
(2 * (P1.Y - P2.Y)) & " * y = " & _
((R2 ^ 2) - (R1 ^ 2) + (P1.X ^ 2) - _
(P2.X ^ 2) + (P1.Y ^ 2) - (P2.Y ^ 2))
'
msj = msj & vbCrLf & vbCrLf & _
".Esta ecuacion la usaremos para despejar una" & vbCrLf & _
"de las incognitas y sustituirla en una de las" & vbCrLf & _
"ecuaciones de las circunferencis."
'
' Asignamos una variable a cada coeficiente para aclarar un
' poco su uso en el codigo
'
Dim a, b, c ', d, e, f As Double
'
a = 2 * (P1.X - P2.X)
b = 2 * (P1.Y - P2.Y)
c = R2 - R1 + (P1.X ^ 2) - (P2.X ^ 2) + (P1.Y ^ 2) - (P2.Y ^ 2)
'
' despejamos x
'
msj = msj & vbCrLf & vbCrLf & _
" X = (" & c & " - (" & b & " * Y)) / " & a
'
msj = msj & vbCrLf & vbCrLf & _
".Sustituimos X en la ecuación de la 2ª circunferencia:"
'
msj = msj & vbCrLf & vbCrLf & " " & _
"(((" & c & " - (" & b & " * Y)) / " & a & ") - " & _
P2.X & ") ^ 2 + (y - " & P2.Y & ") ^ 2 = " & (R2 ^ 2)
'
' Y de momento aqui ando liado. Voy a unificar los coeficientes
' para aplicar la funcion para Ecuaciones de 2º grado
'
' lo siguiente es provisional a la espera de llegar al final,
' ahora simplemente devuelve los mismos puntos que le pasamos.
' Es para ir probando el msj sin que te de la tabarra el editor 8-)
'
Dim pfs() As PointF = {P1, P2}
Return pfs
End Function

y para probarlo por ej:

Dim pf() As PointF = PuntosCircSecantes(New PointF(4, 3), _
New PointF(7, 2), 2, 2, msj)
Debug.Print(msj)

bueno, como ves (veis) no exagero mucho al decir que soy un 'pelin' retorcidillo, pero al menos,
aparte de instructivo, resulta bastante entretenido

un saludo y muchas gracias de nuevo (tomo nota de tu ultimo apunte)
Ivan
Ivan
2008-06-29 00:43:37 UTC
Permalink
sorry,

evidentemente en la prueba de la funcion
Post by Ivan
Dim pf() As PointF = PuntosCircSecantes(New PointF(4, 3), _
New PointF(7, 2), 2, 2, msj)
Debug.Print(msj)
el nombre deberia ser igual al de esta (CircSecantes) o cambiarselo a la funcion por
PuntosCircSecantes, que es lo que yo he hecho sobre la marcha y de ahi el error.

y [tambien] evidentemente habria que declarar previamente el string [me lo he zampado]

Dim msj as string = "" 'pej.

aunque parece bastante evidente, para no liar a nadie

un saludo
Ivan

PD: de todas formas, aparte de cualquier correccion y/o sugerencia sobre los codigos, cualquier otra
forma de animar 'palitos' seria bienvenida :-)
Ivan
2008-06-29 16:06:48 UTC
Permalink
FE de otra errata mas:

Aqui =>
    '   completa [a^2 + bx + c = 0] o incompleta
    '   en sus 2 versiones [a^2 + bx = 0] o [a^2 + c = 0]
deberia poner =>
' completa [ax^2 + bx + c = 0] o incompleta
' en sus 2 versiones [ax^2 + bx = 0] o [ax^2 + c = 0]
me habia comido la incognita (x) del primer miembro de la ecuacion

un saludo
Ivan
Ivan
2008-07-04 23:32:29 UTC
Permalink
hola de nuevo,

aunque un poco tarde por falta de tiempo, y por [+/-] acabar lo
comenzado, aqui pongo lo que he conseguido hssta ahora respecto a los
puntos de corte de 2 circunferencias de corte, y ya de paso, por si a
alguien le sirven o por si alguien quiere enmendarlas, pongo varias
funciones que he ido probando en estos dias y que devuelven la
ecuacion de una recta teniendo 2 puntos, la descomposicion en factores
de un numero, el Maximo Comun Divisor y el Minimo comun Multiplo de
varios numeros

gracias especialmente en este caso a Leonardo y Sergio en este foro, y
a Antonio Gonzalez en el de ciencia.matematicas, asi como a varios
expertos mas de varios foros de matematicas, que directa o
indirectamente me han ayudado con estos destrozos

un saludo y a continuacion pongo los codigos, por si a alguien le
sirven o por si alguien quiere corregirlos/simplificarlos
Ivan


PD: OJO: puede haber algun que otro error 'matematico', aunque en mis
pruebas parecen ir bien

' **************************************
' ------------------------------------------------------
' para ecuacion de 2º grado completa [a^2 + bx + c = 0]
' ( importar System.Math ) basada en funciones de
' Leonardo Azpurua [27/06/08] (aunque sin verificar)
'
Public Function Ecuacion2doGrado( _
ByVal a As Double, _
ByVal b As Double, _
ByVal c As Double) As Double()

Dim x1, x2 As Double
If a = 0 Then
MsgBox("La ecuacion no es de 2º grado.")
Return Nothing
ElseIf b = 0 Then
If c = 0 Then
' esta solucion me la estoy inventando a falta
' de repasar un poco de mates. Sorry ...
'
x1 = Sqrt(1 / a)
x2 = -(Sqrt(1 / a))
Else
x1 = Sqrt(-c / a)
x2 = -(Sqrt(-c / a))
End If
ElseIf c = 0 Then
x1 = 0
x2 = -b / a
Else
x1 = ((-b) + Sqrt((b ^ 2) - (4 * a * c))) / (2 * a)
x2 = ((-b) - Sqrt((b ^ 2) - (4 * a * c))) / (2 * a)
End If
Dim xs() As Double = {x1, x2}
Return xs
End Function
'
' -----------------------------------------------
' Devuelve los puntos de interseccion entre dos
' circunferencias secantes.
'
Public Function PuntosSecanteDosCircunferencias( _
ByVal p1 As PointF, ByVal p2 As PointF, _
ByVal r1 As Double, ByVal r2 As Double) As PointF()
'
' habria que comprobar si las circunferencias son secantes,
' bien aqui, bien antes de llamar a la funcion
Try
'
' coeficientes de la secante a ambas circunferencias
Dim a As Double = 2 * (p1.X - p2.X)
If a = 0 Then a = 1
Dim b As Double = 2 * (p1.Y - p2.Y)
If b = 0 Then b = 1
Dim c As Double = (r2 ^ 2) - (r1 ^ 2) - (p2.X ^ 2) + _
(p1.X ^ 2) - (p2.Y ^ 2) + (p1.Y ^ 2)
'
' coeficientes de la ecuacion de 2º grado para hallar
'x'
' de los puntos de corte tras sustituir la y
Dim aa As Double = (b ^ 3) + (b * (a ^ 2))
Dim bb As Double = 2 * ((a * (b ^ 2) * p1.Y) - _
(a * c * b) - ((b ^ 3) * p1.X))
Dim cc As Double = (b * (c ^ 2)) + ((b ^ 3) * _
(p1.X ^ 2)) + ((b ^ 3) * (p1.Y ^ 2)) - _
((b ^ 3) * (r1 ^ 2)) - (2 * (b ^ 2) * p1.Y * c)
'
' hallamos los valores de x
Dim pxs() As Double = Ecuacion2doGrado(aa, bb, cc)
'
' coeficientes de la ecuacion de 2º grado para hallar
' la 'y' de los puntos de corte tras sustituir la x
aa = (a ^ 3) + (a * (b ^ 2))
bb = 2 * (((a ^ 2) * b * p2.X) - (a * b * c) - _
((a ^ 3) * p2.Y))
cc = ((a * (c ^ 2)) + ((a ^ 3) * (p2.X ^ 2)) + _
((a ^ 3) * (p2.Y ^ 2)) - ((a ^ 3) * (r2 ^ 2)) - _
(2 * ((a ^ 2) * p2.X * c)))
'
' hallamos los valores de y
Dim pys() As Double = Ecuacion2doGrado(aa, bb, cc)
'
' devolvemos los dos puntos de interseccion
Dim pts() As PointF = {New PointF(pxs(1), pys(0)), _
New PointF(pxs(0), pys(1))}
Return pts
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
Return Nothing
End Function
'
' ------------------------------------------------
' Devuelve una cadena con la ecuacion de la recta
' entre dos puntos dados.
'
Public Function RectaPorDosPuntos( _
ByVal p1 As PointF, ByVal p2 As PointF, _
ByRef Coeficientes() As Double) As String
Dim a As Double = p2.Y - p1.Y
Dim b As Double = p1.X - p2.X
Dim c As Double = (p1.Y * (p2.X - p1.X)) - _
(p1.X * (p2.Y - p1.Y))
Dim coef() As Double = {a, b, c}
Coeficientes = coef
Return a & "x" & IIf(b < 0, "", "+") & b & "y" & _
IIf(c < 0, "", "+") & c & "=0"
End Function
'
' ----------------------------------------------------------
' Devuelve una coleccion sortedList con la descomposicion
' en factores primos de un nro. La clave seria el factor y
' el valor el exponente.
'
Public Function PrimosNro(ByVal pNro As Integer) As SortedList
Dim vPrimos As New SortedList
Dim vValor As Integer = pNro
Dim sn As String = ""
Do While vValor > 1
For n As Integer = 2 To vValor
If vValor Mod n = 0 Then
If Not vPrimos.Contains(n) Then
vPrimos.Add(n, 1)
Else
vPrimos(n) = vPrimos(n) + 1
End If
vValor = vValor / n
Exit For
End If
Next
Loop
Return vPrimos
End Function
'
' -------------------------------------------
' Devuelve una cadena con la descomposicion
' en factores primos de un nro.
'
Public Function StringPrimosNro(ByVal pNro As Integer) As String
If pNro = 0 Then
MsgBox("No se admite la división por cero")
Return Nothing
End If
Dim msj As String = ""
Dim slP As SortedList = PrimosNro(pNro)
For Each dEt As DictionaryEntry In slP
msj = msj & dEt.Key & IIf(dEt.Value > 1, _
"^" & dEt.Value, "") & ", "
Next
Return msj.Trim.TrimEnd(", ")
End Function
'
' -------------------------------------------
' Devuelve el Maximo Comun Divisor de los
' numeros pasados como parametro.
'
Public Function Mcd(ByVal ParamArray pNros() As Integer) As
Integer
Dim vMcd As Integer = 1
Dim vNP As SortedList
Dim vPrimos As New SortedList
For vn As Integer = 0 To pNros.Length - 1
vNP = PrimosNro(pNros(vn))
If vn = 0 Then
vPrimos = vNP
Else
Dim n As Integer = 0
Do While n < vPrimos.Count
If vNP.ContainsKey(vPrimos.GetKey(n)) Then
If vNP(vPrimos.GetKey(n)) < _
vPrimos.GetByIndex(n) Then
vPrimos.SetByIndex(n, _
vNP(vPrimos.GetKey(n)))
End If
n += 1
Else
vPrimos.RemoveAt(n)
End If
Loop
End If
Next
For Each dE As DictionaryEntry In vPrimos
vMcd = vMcd * (dE.Key ^ dE.Value)
Next
Return vMcd
End Function
'
' -------------------------------------------
' Devuelve el Minimo Comun Multiplo de los
' numeros pasados como parametro.
'
Public Function Mcm(ByVal ParamArray pNros() As Integer) As
Integer
Dim vMcm As Integer = 1
Dim vNP As SortedList
Dim vPrimos As New SortedList
For vn As Integer = 0 To pNros.Length - 1
vNP = PrimosNro(pNros(vn))
If vn = 0 Then
vPrimos = vNP
Else
Dim n As Integer = 0
Do While n < vNP.Count
If vPrimos.ContainsKey(vNP.GetKey(n)) Then
If vNP.GetByIndex(n) > _
vPrimos(vNP.GetKey(n)) Then
vPrimos(vNP.GetKey(n)) = _
vNP.GetByIndex(n)
End If
'n += 1
Else
vPrimos.Add(vNP.GetKey(n), _
vNP.GetByIndex(n))
End If
n += 1
Loop
End If
Next
For Each dE As DictionaryEntry In vPrimos
vMcm = vMcm * (dE.Key ^ dE.Value)
Next
Return vMcm
End Function
'**********************************

Continúe leyendo en narkive:
Loading...