por wenner
- 27 Mar 2011, 12:04

-
Perfil básico de usuario
- 27 Mar 2011, 12:04
#262767
Hola Tesla,
Revisa la siguiente función, es posible que tenga algún error ya que no he podido contrastarla con datos de entrada reales, así que va un poco en el aire.
Un saludo,
Revisa la siguiente función, es posible que tenga algún error ya que no he podido contrastarla con datos de entrada reales, así que va un poco en el aire.
Código: Seleccionar todo
Function Catenaria(T0, q0, q, a, b, d, alfa, t1, t2, E, S) As Double
'___Título: Catenaria
'___Razón: http://www.soloingenieria.net/foros/viewtopic.php?f=14&t=26301
'___Autor: wenner
'___Método: Newton-Raphson
'___Fecha: 27/03/2011
Dim F As Double 'Tipo F(x)=0
Dim f1 As Double
Dim f2 As Double
Dim f3 As Double
'___Derivadas respecto x
Dim dF As Double
Dim df1 As Double
Dim df2 As Double
Dim df3 As Double
'___Diferenciación numérica
Dim dx As Double
Dim dFdx As Double
Const Dif As Double = 0.000001 '1e-6
'___Valores de x para el bucle
Dim x1 As Double
Dim x2 As Double
Dim n As Byte 'Contador de bucle
Const Iteraciones As Byte = 50 'Número máximo de iteraciones
Const Precision As Double = 0.0000000001 '1e-10
'___Aproximación valor inicial de T (variable x)
x1 = 100
For n = 1 To Iteraciones
With WorksheetFunction
f1 = (4 * x1 ^ 2 / q ^ 2 * (.Sinh(a * q / (2 * x1))) ^ 2 + d ^ 2) ^ (1 / 2)
f2 = (4 * T0 ^ 2 / q0 ^ 2 * (.Sinh(a * q0 / (2 * T0))) ^ 2 + d ^ 2) ^ (1 / 2) 'Es constante
f3 = 1 + alfa * (t2 - t1) + (x1 - T0) / (E * S) * b / a
F = f1 - f2 * f3
dx = x1 * (1 + Dif)
df1 = (4 * dx ^ 2 / q ^ 2 * (.Sinh(a * q / (2 * dx))) ^ 2 + d ^ 2) ^ (1 / 2)
df2 = f2
df3 = 1 + alfa * (t2 - t1) + (dx - T0) / (E * S) * b / a
dFdx = df1 - df2 * df3
dF = (dFdx - F) / (dx - x1)
End With
x2 = x1 - F / dF
If Abs(x2 - x1) < Precision Then
Catenaria = x2
Exit For
Else
x1 = x2
n = n + 1
End If
Next
If n = Iteraciones Then Catenaria = CVErr(xlErrNA)
End Function
Un saludo,