hola buenos dias necesito una ayuda de como hacer estos tres metodos biseccion, el de la secante y el Newton-Raphson en excel los procedimiento paso a paso si es posible y muchas gracias de ante manos
Mié, 08/02/2012 - 15:11
#1
metodos de la biseccion, de la secante y el de Newton-Raphson en excel
¿cómo defines la función para la que quieres calcular los ceros?
ya sabes que Excel sólo entiende valores, puntos, en sus celdas, pero no funciones continuas. A no ser que pongas la fórmula en una celda y las variables en otras celdas auxiliares.
¿o lo que necesitas es un algoritmo en VBA?
------
Ya sé Excel, pero necesito más ahora en pdf
------
Ya sé Excel, pero necesito más.
por lo menos en excel se coloca esta funcion de f(x) (e^-x^2) - x o en vba tambien me sirve esa funcion se puede hacer por los tres metodos por lo que me han dicho
Para curiosear...
http://ingenieriasimple.com/url/introprogra/VBA/VBAExcel-MNumericos.pdf (páginas 54-55), ahí tienes la macro VBA para el método Newton-Raphson
Sub CalculaPosicion()
intIteracion = 0
ActiveSheet.Cells(ActiveCell.Row, ActiveCell.Column + 1).Value2 = fBiseccion(ActiveSheet.Cells(ActiveCell.Row, ActiveCell.Column).Value2, ActiveSheet.Cells(ActiveCell.Row + 1, ActiveCell.Column).Value2, 0.000001)
'El método de bisección, adaptado de la Wikipedia:
Function fFuncionCalculo(ByRef X) As Double
'Aquí tienes que poner la función de cálculo
fFuncionCalculo = (Exp(-X * X)) - X
End Function
Dim f_a As Double
Dim f_b As Double
Dim f_c As Double
Dim Xc As Double
Dim Seguimiento As String
Static intIteracion As Integer
f_b = fFuncionCalculo(Xb)
errorAproximacion = VBA.Abs(Xa - Xb)
Do While tolerancia <= errorAproximacion
Xc = (Xa + Xb) / 2 'Se toma el valor medio entre los extremos
f_c = fFuncionCalculo(Xc) 'Se obtiene el valor de la función en dicho punto
errorAproximacion = VBA.Abs(Xa - Xb)
Seguimiento = CStr(intIteracion) + "ª" & VBA.Chr(9) & "x= " & VBA.CStr(Xc) & Chr(9) & " f(x)= " & VBA.CStr(f_c) & VBA.Chr(9) & " error= " & VBA.CStr(errorAproximacion) & VBA.Chr(13) & VBA.Chr(10)
intIteracion = intIteracion + 1
If ((f_c * f_a) < 0) Then 'Si el cambio de signo se produce entre Xa y Xc, cambiamos los límites
Xb = Xc
ElseIf ((f_c * f_b) < 0) Then 'Si el cambio de signo se produce entre Xc y Xb, cambiamos los límites
Xa = Xc
End If
Loop
Else
MsgBox "Verifique que entre " & Xa & " y " & Xb & " exista una raíz. Acote mejor los extremos de la raiz y vuelva a empezar"
Exit Function
End If
fRaizBiseccion = Xc
Dim f_a As Double, f_b As Double, f_c As Double
Dim Xc As Double
Dim Seguimiento As String
Static intIteracion As Integer
f_b = fFuncionCalculo(Xb)
errorAproximacion = VBA.Abs(Xa - Xb)
Do While tolerancia <= errorAproximacion
Xc = Xb - ((Xb - Xa) * f_b / (f_b - f_a)) 'Se toma el valor secante entre los extremos
Else
Xc = (Xa + Xb) / 2 'El punto medio, para evitar el paso por tramos concavos o convexos
End If
f_c = fFuncionCalculo(Xc) 'Se obtiene el valor de la función en dicho punto
errorAproximacion = VBA.Abs(Xa - Xb)
Seguimiento = CStr(intIteracion) + "ª" & VBA.Chr(9) & "x= " & VBA.CStr(Xc) & Chr(9) & " f(x)= " & VBA.CStr(f_c) & VBA.Chr(9) & " error= " & VBA.CStr(errorAproximacion) & VBA.Chr(13) & VBA.Chr(10)
intIteracion = intIteracion + 1
If ((f_c * f_a) < 0) Then 'Si el cambio de signo se produce entre Xa y Xc, cambiamos los límites
Xb = Xc
ElseIf ((f_c * f_b) < 0) Then 'Si el cambio de signo se produce entre Xc y Xb, cambiamos los límites
Xa = Xc
End If
Loop
Else
MsgBox "Verificar que entre " & Xa & " y " & Xb & " existe una raíz. Acote mejor los extremos de la raiz y vuelva a empezar"
Exit Function
End If
fRaizSecante = Xc
Public Function fRaizRegulaFalsi(ByRef Xa As Double, ByRef Xb As Double, Optional ByVal tolerancia As Double = 0.000001) As Double
'Es el mejor método de aproximación... entre Bisección, Newton-Rapshon y Secante
Dim Xc As Double
Dim bCambioA As Boolean, bCambioB As Boolean
Dim errorAproximacion As Double
Dim Seguimiento As String
Static intIteracion As Integer
f_b = fFuncionCalculo(Xb)
errorAproximacion = VBA.Abs(Xa - Xb)
Do While tolerancia <= errorAproximacion
If f_a <> f_b Then
Xc = ((f_b * Xa) - (f_a * Xb)) / (f_b - f_a) 'Se toma el valor secante entre los extremos
Else
Xc = (Xa + Xb) / 2 'El punto medio, para evitar el paso por tramos concavos o convexos
End If
f_c = fFuncionCalculo(Xc) 'Se obtiene el valor de la función en dicho punto
errorAproximacion = VBA.Abs(Xa - Xb)
Seguimiento = CStr(intIteracion) + "ª" & VBA.Chr(9) & "x= " & VBA.CStr(Xc) & Chr(9) & " f(x)= " & VBA.CStr(f_c) & VBA.Chr(9) & " error= " & VBA.CStr(errorAproximacion) & VBA.Chr(13) & VBA.Chr(10)
intIteracion = intIteracion + 1
If ((f_c * f_a) < 0) Then 'Si el cambio de signo se produce entre Xa y Xc, cambiamos los límites
Xb = Xc
If bCambioB = True Then
Xc = ((f_b * Xa) - (2 * f_a * Xb)) / (f_b - 2 * f_a)
bCambioA = False: bCambioB = False
Else
bCambioA = False: bCambioB = True
End If
ElseIf ((f_c * f_b) < 0) Then 'Si el cambio de signo se produce entre Xc y Xb, cambiamos los límites
Xa = Xc
If bCambioA = True Then
bCambioA = False: bCambioB = False
Else
bCambioA = True: bCambioB = False
End If
End If
Loop
Else
MsgBox "Verificar que entre " & Xa & " y " & Xb & " existe una raíz. Acote mejor los extremos de la raiz y vuelva a empezar"
Exit Function
End If
fRaizRegulaFalsi = Xc
MsgBox intIteracion
-----------------------------------------------------------------
www.TrazEX.com (soluciones sobre Excel)