MrGatovsky

Bairstow_Chapra

Feb 26th, 2022
1,027
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.20 KB | None | 0 0
  1. import sympy as sp
  2. import numpy as np
  3.  
  4. import grafica
  5.  
  6.  
  7. def raiz_cuadratica(r, s):
  8.     disc = r ** 2 + 4 * s
  9.  
  10.     # mientras que disc no sea 0 se procede a sacar las raíces por
  11.     # el método cuadrático
  12.     if disc > 0:
  13.         r1 = (r + sp.sqrt(disc)) / 2
  14.         r2 = (r - sp.sqrt(disc)) / 2
  15.  
  16.         i1 = 0
  17.         i2 = 0
  18.  
  19.     # si es 0 o menor para evitar indeterminanción
  20.     else:
  21.         r1 = r / 2
  22.         r2 = r1
  23.         i1 = sp.sqrt(abs(disc)) / 2
  24.         i2 = -i1
  25.  
  26.     return r1, i1, r2, i2
  27.  
  28.  
  29.  
  30. def baisrtow(es, rr, ss, itmax):
  31.     a = [1, -3.5, 2.75, 2.125, -3.875, 1.25]
  32.     nn = a.__len__()
  33.     b = [0] * nn
  34.     c = [0] * nn
  35.     r = rr
  36.     s = ss
  37.     re = [0] * nn
  38.     im = [0] * nn
  39.     n = nn-1
  40.     it = 0
  41.     ea1 = 1
  42.     ea2 = 1
  43.  
  44.     while True:
  45.         if n < 3 or it >= itmax:
  46.             break
  47.         it = 0
  48.         while True:
  49.             it += 1
  50.             b[n] = a[n]
  51.             b[n - 1] = a[n - 1] + r * b[n]
  52.             c[n] = b[n]
  53.             c[n - 1] = b[n - 1] + r * c[n]
  54.  
  55.             for i in range(n - 2, 0, -1):
  56.                 b[i] = a[i] + r * b[i + 1] + s * b[i + 2]
  57.                 c[i] = b[i] + r * c[i + 1] + s * c[i + 2]
  58.  
  59.             # determinante de c
  60.             determinante = c[2] * (c[2] - c[3]) * c[1]
  61.  
  62.             # Cálculo de los incrementos de r y s
  63.             if determinante != 0:
  64.                 deltaR = (-b[1] * c[2] + b[0] * c[3]) / determinante
  65.                 deltaS = (-b[0] * c[2] + b[1] * c[1]) / determinante
  66.                 r += deltaR
  67.                 s += deltaS
  68.  
  69.                 # porcentaje de Error aproximado
  70.                 if r != 0:
  71.                     ea1 = abs(deltaR / r) * 100
  72.                     print("ear: ", ea1)
  73.                 if s != 0:
  74.                     ea2 = abs(deltaS / s) * 100
  75.                     print("eas: ", ea2)
  76.             # reajuste de r y s si no es posible resolver las matrices
  77.             # recordando que r y s tinen un valor inicial de -1
  78.             # por tanto se reajustan a 0
  79.             else:
  80.                 r += 1
  81.                 s += 1
  82.                 it = 0
  83.  
  84.             if ea1 <= es and ea2 <= es or it >= itmax:
  85.                 break
  86.  
  87.             ###  cumplido que r y s tengan un error menor o igual al indicado (1%)
  88.             ### se procede a buscar las raíces de la ecuación
  89.  
  90.             lst = raiz_cuadratica(r, s)
  91.             re[n] = lst[0]      # r1
  92.             im[n] = lst[1]      # i1
  93.             re[n - 1] = lst[2]  # r2
  94.             im[n - 1] = lst[3]  # i2
  95.  
  96.             n = n - 2
  97.  
  98.             for i in range(0, n):
  99.                 a[i] = b[i + 2]
  100.                 # print(a[i])
  101.  
  102.     if it < itmax:
  103.         # [raiz1, i1, raiz2, i2]
  104.         if n == 2:
  105.             r = -a[1] / a[2]
  106.             s = -a[0] / a[2]
  107.             lst = raiz_cuadratica(r, s)
  108.             re[n] = lst[0]      # r1
  109.             im[n] = lst[1]      # i1
  110.             re[n - 1] = lst[2]  # r2
  111.             im[n - 1] = lst[3]  # i2
  112.  
  113.         else:
  114.             re[n] = -a[0] / a[1]
  115.             im[n] = 0
  116.     else:
  117.         it = 1
  118.  
  119.     return im
  120.  
  121. def main():
  122.     im = baisrtow(0.001, -1, -1, 5)
  123.     grafica.grafica(im)
  124.  
  125.  
  126. if __name__ == '__main__':
  127.     main()
  128.  
Advertisement
Add Comment
Please, Sign In to add comment