You are on page 1of 14

SOLUCIN DEL PROBLEMA 1 MTODO DE NEWTON RAPHSON PARA DETERMINAR UNA RAIZ REAL DE UNA FUNCIN DE "x".

Problema : Este problema consiste en la bsqueda de una raz real aproximada de una funcin f(x) por el Mtodo de Newton Raphson. Aunque el mtodo es aplicable a cualquier funcin, para simplificar la programacin siempre ser un polinomio, con lo que se satisface el objetivo de ilustrar el mtodo y desarrollar la solucin matemtica y su programacin. Tal funcin polinomial tiene la forma f(x) = an (x - b)n + an-1 (x - b)n-1 + an-2 (x b)n-2 + . . . . a0 estando el valor de n restringido a 6 como mximo para la generacin aleatoria y 10 para la introduccin de datos. SOLUCIN: Interpretacin de la representacin grfica del mtodo, aplicando ANLISIS, RAZONAMIENTO Y APLICACIN DEL CONOCIMIENTO.

En la grfica vemos claramente que: x1 = x0 x y que x = f(x0)/tg(); pero como tg() = pendiente de la tangente a la curva en el punto (x0, y0) , y pend. de la tang. a la curva en (x0, y0) = pend. de la curva en (x0, y0), y pend. de la curva en (x0, y0) = limx0 [(f(x0) f(x 1))/((x 0) (x 1))] = f (x0), tenemos que: x = f(x0)/ f (x0) por lo que, finalmente: x1 = x0 f(x0)/ f (x0). La funcin g(x) y el nuevo valor de x sern siempre los que resulten de la siguiente expresin: xi+1 = xi f(xi)/ f'(xi) = g(x i) , formula general del mtodo La expresin para la derivada de g(x) es g(x) = 1 ( f (x)f (x) f (x)f (x) ) / ( f (x) )2 = f (x)f (x) / ( f (x) )2

Cuando el mtodo de Newton Raphson converge lo hace en unas pocas iteraciones, ya que la convergencia es de orden 2 para races no repetidas, sin embargo hay casos en el que el mtodo no converge sino oscila: cuando no hay raz real, si la raz es un punto de inflexin o si el valor inicial est muy alejado de la raz y alguna otra parte de la funcin "atrapa" la iteracin en una oscilacin. Este mtodo requiere la evaluacin de la primera derivada de f(x), lo cual podra ser una dificultad cuando f(x) est dada en forma tabular y no en forma explcita, como sucede en procesos de laboratorio. LA PROGRAMACIN HECHA POR TECNOLOGAS MEXICANAS: Teniendo ya la solucin matemtica, y solamente hasta tenerla, pudimos ocuparnos de la programacin computacional del mtodo de Newton Raphson. Esta programacin se hizo en el lenguaje Visual Basic 6 para aprovechar su magnfica caja de herramientas interactivas, pero no es intencin de este taller el explicar los detalles del lenguaje, el que deber estudiarse, si no se ha hecho ya. La programacin tiene la opcin de introducir los datos o generarlos aleatoriamente, con las limitaciones abajo especificadas. El nmero de datos que se requiere es siempre 15, pues los coeficientes an que resulten cero para n < 10 debern confirmarse al ser solicitados en el modo de introducir datos: : Grado de la funcin, ( n ) . Coeficiente de (x b)n, ( an ) Coeficiente de (x - b)n-1, ( an-1 ) Coeficiente de (x b)n-2, ( an-2 ) Coeficiente de (x b)o, ( a0 ) o trmino independiente. Valor de b que define el desplazamiento de f(x) con respecto al origen sobre el eje x, que puede ser cero. Mxima tolerancia en el error, ( psilon ) Nmero mximo de iteraciones si hay convergencia, el que se desee, pero podra ser 35 por ejemplo Un valor inicial para x ( x0 ) que siempre es calculado por el propio programa, por lo que no cuenta para la introduccin de datos. En el modo de introducir los datos, es necesario hacerlo en este orden. En este modo, n puede tener valores superiores a 6, sin embargo las posibilidades de convergencia disminuyen con el grado, razn por la cual se limita a 10. En el modo de generacin aleatoria de datos, stos sern : n : 6 como mximo an = 1 an-1 ... a0 : valores convenientes para la ilustracin del mtodo. -6 < b < 6 psilon = 0.0001 nmero mximo de iteraciones : 35, haya o no convergencia. x0 = un valor cercano a la raz calculado por el propio programa.

El programa tiene que calcular x0, Como hacerlo? El programa calcula x0 determinando intervalos de x en los cuales haya, al menos, un valor de f(x) < 1, es decir cercano a cero, siendo los valores extremos de esos intervalos las xs correspondientes a diez valores ms y menos de x, a partir del correspondiente a la f(x) < 1, y buscando luego en el primer intervalo el primer valor de f(x) para el cual f (x) > 0, lo que asegura que una recta tangente a esa f(x) intersectar al eje de las xs, lo que es esencial en este mtodo. Los dems aspectos de la programacin son los relativos al diseo de la interfaz de usuario, a la interactividad, al modo de operacin, a la introduccin de datos, a la presentacin de resultados, respecto a los cuales no entraremos en detalles porque tienen ms que ver con el conocimiento del lenguaje y con la creatividad que con el razonamiento.

El cdigo fuente se presenta a continuacin. En l se hacen anotaciones convenientes para facilitar entender la lgica de la programacin, sin embargo es necesario descubrir por si mismos las respuestas a sus preguntas con objeto de inducir el anlisis y el razonamiento, Como puede concluirse del estudio de este ejercicio, la solucin del problema hasta su programacin implica dos aspectos: uno, la definicin matemtica del mtodo y, dos, el desarrollo del algoritmo computacional; pero ste ni siquiera puede iniciarse si no se tiene la solucin matemtica. Sin embargo, este ejercicio y los futuros son de grado mnimo de dificultad pero, an as, sin el anlisis, el razonamiento y la aplicacin del conocimiento nada puede hacerse.

CDIGO FUENTE:

(Derechos reservados, prohibida su reproduccin)

' Declaraciones de variables globales, tilizadas en diversos procedimientos Dim GenDatos As Integer, KeyAscii As Integer Dim Introducir As Integer, ContDatos As Integer Dim IMAX As Integer, JMAX As Integer Dim epsilon As Single, grado As Integer, xmax As Integer, xmin As Integer, deltax As Single Dim A() As Integer, b As Integer, ValVariable() As Variant, Datos$() Private Sub Ejecutar_Click() On Error GoTo TrampaEjecutar ' Seccin de dimensionamiento y definicin de constantes. LineaNueva$ = Chr$(13) + Chr$(10) ' Mensajes relativos a introduccin de datos errneos. If grado > 10 Or grado < 2 Or grado - Int(grado) <> 0 Then Msg$ = "Se esperaba un nmero >= 2 o <= 10" & LineaNueva$ Msg$ = Msg$ & "Inicie el programa de nuevo." & LineaNueva$ & LineaNueva$ Msg$ = Msg$ & "Ver la descripcin del problema" MsgBox$ Msg$, vbExclamation + vbOKOnly, "Mensaje de Newton Raphson" ElseIf b > 6 Then Msg$ = "Se esperaba un nmero entero entre 1 y 6" & LineaNueva$ Msg$ = Msg$ & "por limitar valores extremos de f(x)." & LineaNueva$ Msg$ = Msg$ & "Inicie el programa de nuevo." & LineaNueva$ & LineaNueva$ Msg$ = Msg$ & "Ver la descripcin del problema" MsgBox$ Msg$, vbExclamation + vbOKOnly, "Mensaje de Newton Raphson" End If ' Solucin general del problema. ' Determina valores de f(x) para futuro graficador d% = (xmax - xmin) / deltax + 2 ReDim C(d%, 6), e(d%, grado) ' C() almacena x, f(x), f'(x), g(x) y g'(x); e() almacena trmino a trmino para cada valor de x n=0 absfmin = 2 ^ 256 Referencia para encontrar absfmin fmax = -(2 ^ 256) Referencia para encontrar fmax For x = xmin To xmax + 0.000000002 Step deltax: Se requiere para que x alcance el valor de xmax suma = 0 n=n+1 nmax = n For k = grado To 0 Step -1 e(n, k) = A(k) * (x - b) ^ k ' Calcula valor de cata trmino del polinomio suma = suma + e(n, k) ' Suma los valores de los trminos del polinomio Next k C(n, 1) = x ' abscisa C(n, 2) = suma ' f(x) u ordenada C(n, 3) = 3 * A(3) * (x - b) ^ 2 + 2 * A(2) * (x - b) + A(1) ' f'(x) C(n, 4) = C(n, 1) - C(n, 2) / C(n, 3) ' g(x) C(n, 5) = (C(n, 4) - C(n - 1, 4)) / (C(n, 1) - C(n - 1, 1)) ' aproximacin de g'(x) C(n, 6) = 1 - (C(n, 3) * C(n, 3) - C(n, 2) * (6 * A(3) * (x - b) + 2 * A(2))) / C(n, 3) ^ 2 ' g'(x) If Abs(C(n, 2)) < Abs(absfmin) Then absfminant = absfmin ' Determina el valor absoluto mnimo de f(x) entre xmin y xmax, absfmin = Abs(C(n, 2)) ' el valor de x correspondiente y la tendencia de f(x) xabsfminant = xabsfmin xabsfmin = C(n, 1) End If If C(n, 2) > fmax Then fmax = C(n, 2) ' Determina el valor mximo de f(x) Next x ' Determina un valor de x0, la x inicial del procedimiento, cercana a la raz buscada Dim x0 As Variant, Convergencia As Boolean

x0 = Empty ReDim xO(100, 2) As Double For k = 1 To nmax 'Si Abs(g(x) - x) < 0.1 o Abs(f(x)) < 1 If Abs(C(k, 4) - C(k, 1)) < 0.1 Or Abs(C(k, 2)) < 1 Then If k <= 10 Then jmin = 1 JMAX = k + 10 ElseIf k > 10 And k < 92 Then jmin = k - 10 JMAX = k + 10 ElseIf k >= 92 Then jmin = k - 10 JMAX = 101 End If For j = jmin To JMAX 'Requisito que Abs(f'(x)) > 0 para que la tangente intersecte al eje "x". If Abs(C(j, 3)) > 0 Then ' Si se cumple el requisito, x0 = C(j, 1) ' asigna el valor de x actual a x0 y j = JMAX Exit For ' sale del ciclo For anidado End If Next If x0 <> 0 Then Exit For ' Encontrado un valor para x0, sale del ciclo For anidador End If Next ' Si x0 no tom ningn valor, ello significa que f(x) no cruza al eje de las x entre xmin y xmax If IsEmpty(x0) Then Convergencia = False ContDatos = 0 Msg$ = "Podra no haber alguna raz real entre " & Str$(xmin) & " y " & Str$(xmax) & " ." & LineaNueva$ Msg$ = Msg$ + "El programa seguir corriendo para comprobarlo." MsgBox Msg$, vbOKOnly + vbExclamation, "Newton Raphson" x0 = xfmin ' solamente para comprobar o no lo anterior End If If Abs(x0) < epsilon Then x0 = Abs(x0) + epsilon ' Es necesario porque el proceso termina si |xltima - xanterior| < epsilon End If ' Interpretacin del mtodo de Newton-Raphson a partir de su representacin grfica y su ' programcin, que constituyen la solucin del problema propuesto. ReDim C1(35, 5) x = x0 iter = -1 contador = 0 desbord = 0 Do Until Abs(x - xant) < epsilon ' 1a. condicin para que el ciclo Do se ejecute If iter < 35 Then ' 2a. condicin; si no se cumple se sale del ciclo Do suma = 0 iter = iter + 1 For k = grado To 0 Step -1 If Abs(x - b) < 2 ^ 64 Then '1.78E+100 Then ' detecta desbordamiento para f(x) suma = suma + A(k) * (x - b) ^ k Else k=0 desbord = desbord + 1 ' Cuenta los desbordamientos If desbord > 5 Then Exit Do ' Detiene la ejecucin si f(x) es muy grande repetidas veces GoTo 10 End If Next k C1(iter, 1) = x ' abscisa C1(iter, 2) = suma ' ordenada = f(x)

C1(iter, 3) = 3 * A(3) * (x - b) ^ 2 + 2 * A(2) * (x - b) + A(1) ' f'(x) C1(iter, 4) = C1(iter, 1) - C1(iter, 2) / C1(iter, 3) ' g(x) C1(iter, 5) = 1 - (C1(iter, 3) * C1(iter, 3) - C1(iter, 2) * (6 * A(3) * (x - b) + 2 * A(2))) / C1(iter, 3) ^ 2 ' g'(x) 10 If Abs(C1(iter, 3)) > 0 Then contador = contador + 1 ' contador aumenta solo cuando Abs(f'(x)) > 0 End If If contador <> iter + 1 Then ' Significa que Abs(f'(x)) = 0 o Abs(f'(x)) = Vaco Convergencia = False ' que indica que no hay raz real en el intervalo Msg$ = "El mtodo no converge en una raz en este caso." & LineaNueva$ Msg$ = Msg$ & "Inicie de nuevo." MsgBox Msg$, vbOKOnly + vbExclamation, "Newton Raphson" Exit Do End If xant = x x = C1(iter, 4) Else Exit Do End If Loop ' Presentacin de resultados en la tabla IMAX = iter + 1 ' sabes por qu ? MSFlexGrid3.Rows = IMAX + 1 ' sabes por qu ? MSFlexGrid3.Col = 0 For i = 1 To IMAX MSFlexGrid3.Row = i MSFlexGrid3.Text = i - 1 Next i For i = 1 To MSFlexGrid3.Rows 1 ' sabes por qu MSFlexGrid3.Rows - 1 ? MSFlexGrid3.Row = i MSFlexGrid3.Col = 1 MSFlexGrid3.Text = C1(i - 1, 1) If MSFlexGrid3.Text = "" Then MSFlexGrid3.Text = "Desbordamiento" MSFlexGrid3.CellBackColor = QBColor(12) MSFlexGrid3.CellForeColor = QBColor(14) End If If MSFlexGrid3.Rows = 37 And MSFlexGrid3.Row = 36 And MSFlexGrid3.Text <> "Desbordamiento" Then MSFlexGrid3.CellBackColor = QBColor(14) End If MSFlexGrid3.Col = 2 MSFlexGrid3.Text = C1(i - 1, 2) If MSFlexGrid3.Text = "" Then MSFlexGrid3.Text = "Desbordamiento" MSFlexGrid3.CellBackColor = QBColor(12) MSFlexGrid3.CellForeColor = QBColor(14) End If If MSFlexGrid3.Rows = 37 And MSFlexGrid3.Row = 36 And MSFlexGrid3.Text <> "Desbordamiento" Then MSFlexGrid3.CellBackColor = QBColor(14) End If MSFlexGrid3.Col = 3 MSFlexGrid3.Text = C1(i - 1, 3) If MSFlexGrid3.Text = "" Then MSFlexGrid3.Text = "Desbordamiento" MSFlexGrid3.CellBackColor = QBColor(12) MSFlexGrid3.CellForeColor = QBColor(14) End If If MSFlexGrid3.Rows = 37 And MSFlexGrid3.Row = 36 And MSFlexGrid3.Text <> "Desbordamiento" Then MSFlexGrid3.CellBackColor = QBColor(14) End If MSFlexGrid3.Col = 4 MSFlexGrid3.Text = C1(i - 1, 4) If MSFlexGrid3.Text = "" Then

MSFlexGrid3.Text = "Desbordamiento" MSFlexGrid3.CellBackColor = QBColor(12) MSFlexGrid3.CellForeColor = QBColor(14) End If If MSFlexGrid3.Rows = 37 And MSFlexGrid3.Row = 36 And MSFlexGrid3.Text <> "Desbordamiento" Then MSFlexGrid3.CellBackColor = QBColor(14) End If MSFlexGrid3.Col = 5 MSFlexGrid3.Text = C1(i - 1, 5) If MSFlexGrid3.Text = "" Then MSFlexGrid3.Text = "Desbordamiento" MSFlexGrid3.CellBackColor = QBColor(12) MSFlexGrid3.CellForeColor = QBColor(14) End If If MSFlexGrid3.Rows = 37 And MSFlexGrid3.Row = 36 And MSFlexGrid3.Text <> "Desbordamiento" Then MSFlexGrid3.CellBackColor = QBColor(14) End If Next i ContDatos = 0 ' Graba los parmetros de cada ejecucin y los dos ltimos valores de x y f(x) NumArch = FreeFile Archivo$ = "C:\ RegNewtonRaph.txt" Open Archivo$ For Append As #NumArch Write #NumArch, grado, A(10), A(9), A(8), A(7), A(6), A(5), A(4), A(3), A(2), A(1), A(0), b, epsilon, iter Write #NumArch, contador, iter + 1, C1(iter - 1, 1), C1(iter - 1, 2), C1(iter, 1), C1(iter, 2) Close #NumArch Exit Sub ' por qu crees que es necesaria esta instruccin ?

TrampaEjecutar: If Err = 6 Then Resume Next If iter = 35 Then Exit Sub ContDatos = 0 Exit Sub ElseIf Err = 9 Then Msg = "Se ha producido el error " & Err & "." & LineaNueva$ Msg = Msg & Error(Err) & LineaNueva$ & LineaNueva$ Msg = Msg & "La solucin del problema ser cancelada." MsgBox Msg, vbExclamation, "Newton Raphson" Stop: Resume solamente para depuracin del programa ContDatos = 0 Exit Sub Else Msg = "Se ha producido el error " & Err & "." & LineaNueva$ Msg = Msg & Error(Err) & LineaNueva$ & LineaNueva$ Msg = Msg & "La solucin del problema ser cancelada." MsgBox Msg, vbExclamation, "Newton Raphson" ' Resume solamente para depuracin del programa ContDatos = 0 End If End Sub Private Sub Form_Load() LineaNueva$ = Chr$(13) + Chr$(10) ' Se inicializan variables ContDatos = 0 NumEntradas = 0 Dim ValVariable(15), A(10) As Integer

' Se caracterizan las celdas de las MSFlexGrids MSFlexGrid1.ColWidth(0) = 1380 MSFlexGrid1.ColWidth(1) = 1080 MSFlexGrid3.ColWidth(0) = 375 For j = 1 To 5 MSFlexGrid3.ColWidth(j) = 1600 Next MSFlexGrid1.ColAlignment(1) = 0 MSFlexGrid3.ColAlignment(-1) = 0 ' Nombres de datos ReDim Datos$(1, 15) contador = 2 Datos$(1, 0) = "Datos" Datos$(1, 1) = "Orden" For i = 10 To 0 Step -1 Datos$(1, contador) = "Coeficiente(" & Str$(i) & ")" contador = contador + 1 Next Datos$(1, 13) = "b" Datos$(1, 14) = "psilon" Datos$(1, 15) = "Nm. Mx. Iters." ' Se asignan ttulos a columnas de MSFlexGrid1 For i = 0 To 15 MSFlexGrid1.Row = i MSFlexGrid1.Col = 0 MSFlexGrid1.Text = Datos$(1, i) Next MSFlexGrid1.Row = 0 MSFlexGrid1.Col = 1 MSFlexGrid1.Text = "Valores" ' Se asignan ttulos a columnas de MSFlexGrid3 MSFlexGrid3.Row = 0 MSFlexGrid3.Col = 0 MSFlexGrid3.Text = "Iter" MSFlexGrid3.Col = 0 MSFlexGrid3.Col = 1 MSFlexGrid3.Text = "x" MSFlexGrid3.Col = 0 MSFlexGrid3.Col = 2 MSFlexGrid3.Text = "f(x)" MSFlexGrid3.Col = 0 MSFlexGrid3.Col = 3 MSFlexGrid3.Text = "f'(x)" MSFlexGrid3.Col = 0 MSFlexGrid3.Col = 4 MSFlexGrid3.Text = "g(x)" MSFlexGrid3.Col = 0 MSFlexGrid3.Col = 5 MSFlexGrid3.Text = "g'(x)" End Sub Private Sub GenerarDatos_Click() GenDatos = True Introducir = False ' Seccin de reiniciacin

ContDatos = 1 MSFlexGrid3.Clear Erase ValVariable() IMAX = 0 JMAX = 0 xmax = 0 xmin = 0 ymax = 0 ymin = 0 ' Se asignan ttulos a columnas de MSFlexGrid3 MSFlexGrid3.Row = 0 MSFlexGrid3.Col = 0 MSFlexGrid3.Text = "Iter" MSFlexGrid3.Col = 0 MSFlexGrid3.Col = 1 MSFlexGrid3.Text = "x" MSFlexGrid3.Col = 0 MSFlexGrid3.Col = 2 MSFlexGrid3.Text = "f(x)" MSFlexGrid3.Col = 0 MSFlexGrid3.Col = 3 MSFlexGrid3.Text = "f'(x)" MSFlexGrid3.Col = 0 MSFlexGrid3.Col = 4 MSFlexGrid3.Text = "g(x)" MSFlexGrid3.Col = 0 MSFlexGrid3.Col = 5 MSFlexGrid3.Text = "g'(x)" ' Generacin aleatoria de datos ReDim A(10), ValVariable(15) Randomize Val(Right$(Time$, 2)) + Val(Mid$(Time$, 4, 2)) + Val(Left$(Time$, 2)) grado = Int(Rnd * 5 + 2) ' Esto genera: 2 <= grado <= 5, sabespor qu ? A(grado) = 1 For i = 7 To 10 A(i) = 0 Next Select Case grado Case 6 Randomize 500 A(5) = Int(Rnd * 2 + 1) Randomize 3000 ' Randomize cambia los resultados posibles de Rnd al cambiar el argumento A(4) = Int(Rnd * 3 + 1) Randomize 4000 A(3) = Int(Rnd * 3 + 1) Randomize 1500 A(2) = Int(Rnd * 2 + 1) If Rnd * 4 > 2 Then A(2) = -A(2) Randomize Val(Right$(Time$, 2)) + Val(Mid$(Time$, 4, 2)) + Val(Left$(Time$, 2)) A(1) = Int(Rnd * 4 + 1) If Rnd * 4 > 2 Then A(1) = -A(1) Randomize 10000 A(0) = Int(Rnd * 5 + 1) If Rnd * 4 < 2 Then A(0) = -A(0) Case 5 A(6) = 0 Randomize 3000 ' Randomize cambia los resultados posibles de Rnd al cambiar el argumento A(4) = Int(Rnd * 3 + 1) Randomize 4000 A(3) = Int(Rnd * 4 + 1) Randomize 1500

A(2) = Int(Rnd * 5 + 1) If Rnd * 4 > 2 Then A(2) = -A(2) Randomize Val(Right$(Time$, 2)) + Val(Mid$(Time$, 4, 2)) + Val(Left$(Time$, 2)) A(1) = Int(Rnd * 3 + 1) If Rnd * 4 > 2 Then A(1) = -A(1) Randomize 10000 A(0) = Int(Rnd * 4 + 1) If Rnd * 4 < 2 Then A(0) = -A(0) Case 4 A(6) = 0 A(5) = 0 A(3) = Int(Rnd * 4 + 1) Randomize A(2) = Int(Rnd * 5 + 1) If Rnd * 4 > 2 Then A(2) = -A(2) Randomize Val(Right$(Time$, 2)) + Val(Mid$(Time$, 4, 2)) + Val(Left$(Time$, 2)) A(1) = Int(Rnd * 3 + 1) If Rnd * 4 > 2 Then A(1) = -A(1) Randomize 10000 A(0) = Int(Rnd * 5 + 1) If Rnd * 4 < 2 Then A(0) = -A(0) Case 3 A(6) = 0 A(5) = 0 A(4) = 0 Randomize A(2) = Int(Rnd * 5 + 1) If Rnd * 4 > 2 Then A(2) = -A(2) Randomize Val(Right$(Time$, 2)) + Val(Mid$(Time$, 4, 2)) + Val(Left$(Time$, 2)) A(1) = Int(Rnd * 3 + 1) If Rnd * 4 > 2 Then A(1) = -A(1) Randomize 10000 A(0) = Int(Rnd * 5 + 1) If Rnd * 4 < 2 Then A(0) = -A(0) Case 2 A(6) = 0 A(5) = 0 A(4) = 0 A(3) = 0 Randomize Val(Right$(Time$, 2)) + Val(Mid$(Time$, 4, 2)) + Val(Left$(Time$, 2)) A(1) = Int(Rnd * 6 + 1) If Rnd * 4 > 2 Then A(1) = -A(1) Randomize A(0) = Int(Rnd * ((A(1) ^ 2) / 4) + 1) If Rnd * 5 > 2.5 Then A(0) = -A(0) End Select b = Int(Rnd * 6) If Int(Rnd * 9 + 1) < 5 Then b = -b epsilon = 0.001 itermax = 35 ValVariable(1) = grado ValVariable(2) = A(10) ValVariable(3) = A(9) ValVariable(4) = A(8) ValVariable(5) = A(7) ValVariable(6) = A(6) ValVariable(7) = A(5) ValVariable(8) = A(4) ValVariable(9) = A(3) ValVariable(10) = A(2) ValVariable(11) = A(1) ValVariable(12) = A(0) ValVariable(13) = b

ValVariable(14) = epsilon ValVariable(15) = itermax xmin = b - 8 xmax = b + 8 deltax = 0.16 For i = 1 To 15 MSFlexGrid1.Row = i MSFlexGrid1.Col = 1 If IsNumeric(ValVariable(i)) Then MSFlexGrid1.Text = CSng(ValVariable(i)) Else MSFlexGrid1.Text = ValVariable(i) End If Next End Sub Private Sub IntrDatos_Click() If ContDatos = 0 Then Introducir = True GenDatos = False ReDim A(10), ValVariable(15) Text1.Text = "" ' Se reasignan ttulos a columnas de MSFlexGrid1 MSFlexGrid1.Clear For i = 0 To 15 MSFlexGrid1.Row = i MSFlexGrid1.Col = 0 MSFlexGrid1.Text = Datos$(1, i) Next MSFlexGrid1.Row = 0 MSFlexGrid1.Col = 1 MSFlexGrid1.Text = "Valores" MSFlexGrid1.Col = 1 For i = 1 To 15 MSFlexGrid1.Row = i MSFlexGrid1.Text = 0 Next ' Se reasignan ttulos a columnas de MSFlexGrid3 MSFlexGrid3.Clear MSFlexGrid3.Row = 0 MSFlexGrid3.Col = 0 MSFlexGrid3.Text = "Iter" MSFlexGrid3.Col = 0 MSFlexGrid3.Col = 1 MSFlexGrid3.Text = "x" MSFlexGrid3.Col = 0 MSFlexGrid3.Col = 2 MSFlexGrid3.Text = "f(x)" MSFlexGrid3.Col = 0 MSFlexGrid3.Col = 3 MSFlexGrid3.Text = "f'(x)" MSFlexGrid3.Col = 0 MSFlexGrid3.Col = 4 MSFlexGrid3.Text = "g(x)" MSFlexGrid3.Col = 0 MSFlexGrid3.Col = 5 MSFlexGrid3.Text = "g'(x)"

deltax = 0.16 ' Seccin de reiniciacin IMAX = 0 JMAX = 0 xmax = 0 xmin = 0 ymax = 0 ymin = 0 EtiqEntradas.Caption = "Teclear el grado" Text1.SetFocus ContDatos = ContDatos + 1 Else Select Case ContDatos Case 1 EtiqEntradas.Caption = "Teclear A(10)" Text1.SetFocus ContDatos = ContDatos + 1 Case 2 EtiqEntradas.Caption = "Teclear A(9)" Text1.SetFocus ContDatos = ContDatos + 1 Case 3 EtiqEntradas.Caption = "Teclear A(8)" Text1.SetFocus ContDatos = ContDatos + 1 Case 4 EtiqEntradas.Caption = "Teclear A(7)" Text1.SetFocus ContDatos = ContDatos + 1 Case 5 EtiqEntradas.Caption = "Teclear A(6)" Text1.SetFocus ContDatos = ContDatos + 1 Case 6 EtiqEntradas.Caption = "Teclear A(5)" Text1.SetFocus ContDatos = ContDatos + 1 Case 7 EtiqEntradas.Caption = "Teclear A(4)" Text1.SetFocus ContDatos = ContDatos + 1 Case 8 EtiqEntradas.Caption = "Teclear A(3)" Text1.SetFocus ContDatos = ContDatos + 1 Case 9 EtiqEntradas.Caption = "Teclear A(2)" Text1.SetFocus ContDatos = ContDatos + 1 Case 10 EtiqEntradas.Caption = "Teclear A(1)" Text1.SetFocus ContDatos = ContDatos + 1 Case 11 EtiqEntradas.Caption = "Teclear A(0)" Text1.SetFocus ContDatos = ContDatos + 1 Case 12 EtiqEntradas.Caption = "Teclear b" Text1.SetFocus ContDatos = ContDatos + 1 Case 13

EtiqEntradas.Caption = "Teclear psilon" Text1.SetFocus ContDatos = ContDatos + 1 Case 14 EtiqEntradas.Caption = "Teclear Iters. Mx." Text1.SetFocus ContDatos = ContDatos + 1 End Select End If End Sub Private Sub MSFlexGrid3_Click() MSFlexGrid3.ToolTipText = MSFlexGrid3.Text End Sub Private Sub MSFlexGrid3_LostFocus() MSFlexGrid3.ToolTipText = "" End Sub Private Sub Salir_Click() Close End End Sub Private Sub Text1_KeyPress(KeyAscii As Integer) On Error GoTo TrampaTxt1KP If KeyAscii = 13 Then ' la tecla es Enter If Introducir = True Then If Not IsNumeric(Text1.Text) Then ElseIf IsNumeric(Text1.Text) Then If ContDatos = 1 Then MSFlexGrid1.Col = 1 MSFlexGrid1.Row = ContDatos MSFlexGrid1.Text = Text1.Text grado = CDbl(Text1.Text) ValVariable(ContDatos) = CDbl(Text1.Text) Text1.Text = "" ElseIf ContDatos > 1 And ContDatos < 13 Then MSFlexGrid1.Col = 1 MSFlexGrid1.Row = ContDatos MSFlexGrid1.Text = Text1.Text A(12 - (ContDatos)) = CInt(Text1.Text) ValVariable(ContDatos) = CDbl(Text1.Text) Text1.Text = "" ElseIf ContDatos = 13 Then MSFlexGrid1.Col = 1 MSFlexGrid1.Row = ContDatos MSFlexGrid1.Text = Text1.Text b = CDbl(Text1.Text) xmin = b - 8 xmax = b + 8 ValVariable(ContDatos) = CDbl(Text1.Text) Text1.Text = "" ElseIf ContDatos = 14 Then MSFlexGrid1.Col = 1 ' Entra aqu cada que se oprime una tecla ' Se habilita la propiedad ToolTipText

MSFlexGrid1.Row = ContDatos MSFlexGrid1.Text = Text1.Text epsilon = CDbl(Text1.Text) ValVariable(ContDatos) = CDbl(Text1.Text) Text1.Text = "" ElseIf ContDatos = 15 Then MSFlexGrid1.Col = 1 MSFlexGrid1.Row = ContDatos MSFlexGrid1.Text = Text1.Text itersmax = CDbl(Text1.Text) ValVariable(ContDatos) = CDbl(Text1.Text) Text1.Text = "" End If End If EtiqEntradas.Caption = "Hacer clic en Ejecutar" IntrDatos_Click End If End If ' se vuelve a ir a IntrDatos_Click hasta terminar de introducirlos.

MSFlexGrid3.Visible = True Exit Sub TrampaTxt1KP: If Err = 13 Then Stop: Resume If IsNumeric(Text1.Text) Then Msg = "Se espera entrada de texto." & LineaNueva$ Msg = Msg & "Teclee correctamente." MsgBox Msg, vbExclamation + vbOKOnly, "ACAE" Text1.SetFocus Else Msg = "Se espera entrada numrica." & LineaNueva$ Msg = Msg & "Teclee correctamente." MsgBox Msg, vbExclamation + vbOKOnly, "ACAE" Text1.SetFocus End If Else Msg = Error(Err) MsgBox Msg, vbExclamation + vbOKOnly, "ACAE" ' Stop: Resume ' provisional End If End Sub Private Sub Text1_LostFocus() ' Entra aqu si Text1 pierde el foco mientras pide un dato

If ContDatos - 1 >= 0 And ContDatos - 1 < 15 Then Beep MsgBox "Se espera que introduzca el dato.", vbOKOnly + vbInformation, "ACAE" Text1.SetFocus End If End Sub

You might also like