Visual Basic - Cantidad máxima de iteraciones

Life is soft - evento anual de software empresarial
 
Vista:
sin imagen de perfil
Val: 9
Ha aumentado su posición en 20 puestos en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Cantidad máxima de iteraciones

Publicado por Edward (5 intervenciones) el 27/11/2019 23:13:03
Hola,

Estoy desarrollando una rutina para aproximar una solución a traves de un ciclo Do Until, dentro de éste ciclo tengo un contador cuyo step es de 0.00009, a pesar de ser un valor muy pequeño tengo problemas con la respuesta por falta de precisión. Cuando trato de disminuir el step a menos de 0.00009 la rutina es detenida por el VBA, asumo que es porque parece ser un ciclo infinito pero en realidad está convergiendo lentamente.
Quiero saber si existe alguna manera para configurar el VBA y que me permita ejecutar una mayor cantidad de iteraciones sin que sea detenida la rutina.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Antoni Masana
Val: 1.259
Plata
Ha mantenido su posición en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Cantidad máxima de iteraciones

Publicado por Antoni Masana (558 intervenciones) el 28/11/2019 17:08:36
Sube un ejemplo de lo que estás haciendo para tener una idea más exacta de lo que haces y como mejorarlo.
También es importante ver comó defines las variables.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.259
Plata
Ha mantenido su posición en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Cantidad máxima de iteraciones

Publicado por Antoni Masana (558 intervenciones) el 29/11/2019 19:36:08
No entiendo que estas haciendo ni como provocar el fallo.

La variable i tiene 6 decimales y con un tipo Single tendría suficientes, si necesitar más precisión usa el tipo Double.

Un par de correcciones:

Para salir del FOR lo mejor y más correcto es un Exit For

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Function Interp_Val(valor, x1, x2, y1, y2)
    Dim difx As Range
    Dim dify As Range
 
    Total_Cells = WorksheetFunction.Count(Range(x1, x2))
 
    Set difx = Range(x1, x2)
    Set dify = Range(y1, y2)
 
    For Each dato In Range(x1, x2)
        k = valor - dato.Value
 
        If dato.Value = x1.Value Then
            n_ini = x1.Row
        End If
 
        n_1 = dato.Row - 1
 
        If k < 0 Then Exit For
 
        x_i = difx.Rows(n_1 - n_ini + 2)
        x_j = difx.Rows(n_1 - n_ini + 3)
 
        y_i = dify.Rows(n_1 - n_ini + 2)
        y_j = dify.Rows(n_1 - n_ini + 3)
    Next dato
    Interp_Val = (valor - x_i) * (y_j - y_i) / (x_j - x_i) + y_i
End Function


Y aquí falta definir la variable i

1
2
3
4
5
6
7
8
9
10
11
12
13
Function StrainC(Stress)
    Dim e0, S As Single, i As Single
    Dim f As Integer
    f = Sheets("Sheet1").Range("C3").Value
    e0 = 0.00135
 
    i = 0
    Do Until S >= Stress
        i = i + 0.000001
        S = f * ((2 * i / e0) - (i / e0) ^ 2)
    Loop
    StrainC = i
End Function


Esto no hace lo que se supone que hace, se supone que todas las variables del DIM son single y no es verdad.

1
2
Dim C, D, i, S As Single
Dim A, B As Integer

Lo correcto y más seguro es esto:

1
2
Dim C As Single, D As Single, i As Single, S As Single
Dim A As Integer, B As Integer


Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 9
Ha aumentado su posición en 20 puestos en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Cantidad máxima de iteraciones

Publicado por Edward (5 intervenciones) el 29/11/2019 20:19:46
Hola que tal
Hice las correcciones en la declaracion de variables.
El problema está en el codigo del botón "Aproximar".
En la celda AN177 se define el tamaño del incremento, entre más pequeño el incremento más precisa es la aproximación.
El problema aparece cuando intentas usar 0.00007 o menor, el excel cierra el documento súbitamente como si se tratara de un Loop sin fin.
En el adjunto encontrarás algunas imágenes del problema más el documento.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 9
Ha aumentado su posición en 20 puestos en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Cantidad máxima de iteraciones

Publicado por Edward (5 intervenciones) el 02/12/2019 23:40:23
Hola, he encontrado parte de la falla.
Resulta que la memoria se llena y esto provoca un desbordamiento (adjunto una imagen), esto lo solucioné con "Application.ScreenUpdating = False"
Pero sigo teniendo un desbordamiento de memoria y no logro detectar donde.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.259
Plata
Ha mantenido su posición en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Cantidad máxima de iteraciones

Publicado por Antoni Masana (558 intervenciones) el 03/12/2019 12:25:37
Tiene un problema en el ordenador, en el mio tengo 16 GB de RAM y no tengo ningún problema al cargar la hoja o al realizar los cálculos.
Como dices en tu último comentario, " esto provoca un desbordamiento " a menos que algo se me escape no debes tener suficiente memoria para procesar esta hoja de cálculo.

Cuenta que pasos sigues antes del desbordamiento para ver si lo puedo provocar, en caso contrario la solución seria ampliar la memoria.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 9
Ha aumentado su posición en 20 puestos en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Cantidad máxima de iteraciones

Publicado por Edward (5 intervenciones) el 03/12/2019 15:00:40
Bueno, estoy trabajando en un pc del trabajo que tiene 32gb.
Adjunto envío una captura con los datos iniciales que debes ingresar para provocar el desbordamiento.
En mi caso luego de ejecutar 6 veces el botón "Aproximar" se llenó la memoria y se cerró el documento, tambien envío capturas del TaskManager donde se ve el aumento en el uso de la memoria.
Me comentas como te va.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.259
Plata
Ha mantenido su posición en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Cantidad máxima de iteraciones

Publicado por Antoni Masana (558 intervenciones) el 03/12/2019 16:57:26
Viendo el ultimo mensaje y el error que da Windows entiendo cual es el problema. Lo que no se es donde está.

Windows lo dice bien claro:

Balance alcanzado, cantidad de iteracciones: 54[/b]

El problema es interpretarlo. ¿Que significa iteración? Yo tampoco lo sabia y lo he tenido que buscar.

ITERACIÓN
es el cálculo repetido de una hoja de cálculo hasta que se cumple una condición numérica específica. Excel no puede calcular automáticamente una fórmula que hace referencia a la celda, ya sea directa o indirectamente, que contiene la fórmula. Esto se denomina referencia circular. Si una fórmula hace referencia a una de sus propias celdas, deberá determinarse cuántas veces hay que actualizar la fórmula. Las referencias circulares se pueden recorrer en iteración de manera indefinida. Sin embargo, puede controlar el número máximo de iteraciones y la cantidad aceptable de cambios.

El problema no radica en el Do Until de las funciones StrainPS o StrainC

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Function Interp_Val(valor, x1, x2, y1, y2)
    Dim difx As Range
    Dim dify As Range
 
    Total_Cells = WorksheetFunction.Count(Range(x1, x2))
 
    Set difx = Range(x1, x2)
    Set dify = Range(y1, y2)
 
    For Each dato In Range(x1, x2)
        k = valor - dato.Value
        If dato.Value = x1.Value Then
            n_ini = x1.Row
        End If
        n_1 = dato.Row - 1
        If k < 0 Then Exit For
        x_i = difx.Rows(n_1 - n_ini + 2)
        x_j = difx.Rows(n_1 - n_ini + 3)
        y_i = dify.Rows(n_1 - n_ini + 2)
        y_j = dify.Rows(n_1 - n_ini + 3)
    Next dato
    Interp_Val = (valor - x_i) * (y_j - y_i) / (x_j - x_i) + y_i
End Function

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Function StrainPS(Stress)
    Dim C, D, i, S As Single
    Dim A, B As Integer
    A = 887
    B = 27613
    C = 112.4
    D = 7.36
    i = 0
    Do Until S >= Stress
        i = i + 0.000001
        S = 6.89475729316836 * (i * (A + (B / ((1 + (C * i) ^ D) ^ (1 / D)))))
    Loop
    StrainPS = i
End Function

1
2
3
4
5
6
7
8
9
10
11
12
Function StrainC(Stress)
    Dim e0, S As Single
    Dim f As Integer
    f = Sheets("Sheet1").Range("C3").Value
    e0 = 0.00135
    i = 0
    Do Until S >= Stress
        i = i + 0.000001
        S = f * ((2 * i / e0) - (i / e0) ^ 2)
    Loop
    StrainC = i
End Function

Revisando las fórmulas puede que el problema este en el área B49:F99 ya que cada fila depende de la anterior.
En mi excel las iteraciones esta a 100 y no tengo problemas o al menos eso creo.

Para cambiar las iteracción: Archivo - Opciones - Formulas


Saludos.
\\//
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar