Advertisement
Dantenerosas

Untitled

May 4th, 2015
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.38 KB | None | 0 0
  1. import math
  2. from decimal import Decimal
  3.  
  4.  
  5. # Расчет значений исходной функции на промежутке [a; b] с шагом h
  6. # h должен быть такой, что (b - a)/h - целое число
  7. def calc_Ys_Xs(func, a, b, h):
  8.     # Список со всеми значениями
  9.     l_values = [[], []]
  10.     # Кол-во значений X и Y
  11.     k = int((b - a)/h) + 1
  12.     x = Decimal(a)
  13.     for i in range(k):
  14.         l_values[0].append(x)
  15.         l_values[1].append(func(x))
  16.         x += h
  17.     for i in range(2, k + 1):
  18.         if len(l_values[i-1]) != 1:
  19.             l_values.append([])
  20.             for j in range(1, len(l_values[i - 1])):
  21.                 l_values[i].append(l_values[i - 1][j] - l_values[i - 1][j - 1])
  22.         else:
  23.             break
  24.     return l_values
  25.  
  26.  
  27. # Найти y(x) при помощи полинома (выбор полинома зависит от fl)
  28. def calc_polyominal(l_values, x, h, fl = 0):
  29.     # Грубо говоря, это значение произведения q(q-1)(q-2)...(q-n+1) для текущей
  30.     # итерации
  31.     n_q = Decimal(1)
  32.     if fl == 0:
  33.         q = Decimal((x - l_values[0][0])/h)
  34.         y = Decimal(l_values[1][0])
  35.     else:
  36.         q = Decimal((x - l_values[0][len(l_values[0]) - 1])/h)
  37.         y = Decimal(l_values[1][len(l_values[1]) - 1])
  38.     # Цикл начинается с 2, т.к. 0 и 1 списки это Х и Y, соответственно
  39.     for i in range(2, len(l_values)):
  40.         if fl == 0:
  41.             n_q *= q - i + 2
  42.             y += (n_q/Decimal(math.factorial(i - 1)))*l_values[i][0]
  43.         else:
  44.             n_q *= q + i - 2
  45.             y += (n_q/Decimal(math.factorial(i - 1)))*l_values[i][len(l_values[i]) - 1]
  46.     return Decimal(y)
  47.  
  48.  
  49. def calc_diff(func, x, eps):
  50.     x = Decimal(x)
  51.     return Decimal((func(x+eps) - func(x))/eps)
  52.  
  53.  
  54. def first_diff(q):
  55.     return Decimal(Decimal(2.5)*(Decimal(-0.157617)+Decimal(0.09025)*q-Decimal(0.027825)*(q**2)+Decimal(0.0045)*(q**3)-Decimal(0.000291667)*(q**4)))
  56.  
  57.  
  58. def main():
  59.     func = lambda x: Decimal(math.atan(1/(2*x)))
  60.     a = Decimal(1.0)
  61.     b = Decimal(5.0)
  62.     n = Decimal(10)
  63.     eps = Decimal(10**(-10))
  64.     h = Decimal((b-a)/n)
  65.     ys = calc_Ys_Xs(func, a, b, h)
  66.     func_fd = lambda x: Decimal(calc_diff(func, x, Decimal(10**(-7))))
  67.     print("|%-10s|%-10s|%-10s|%-10s|%-10s|%-10s|%-10s|%-10s|%-10s|%-10s|%-10s|"
  68.           % ('X', 'Y', 'd^1 Y', 'd^2 Y', 'd^3 Y', 'd^4 Y', 'd^5 Y', 'd^6 Y',
  69.               'd^7 Y', 'd^8 Y', 'd^9 Y'), "%-10s|" % 'd^10 Y', sep="")
  70.     print("-" * 133)
  71.     for i in range(len(ys[0])):
  72.         print("|%-10.6f|%-10.6f" % (ys[0][i], ys[1][i]), sep="", end="")
  73.         for j in range(2, len(ys)):
  74.             try:
  75.                 print("|%-10.6f" % (ys[j][i]), end="")
  76.             except IndexError:
  77.                 print("|     -    ", end="")
  78.         print('|')
  79.     print()
  80.     print("|%-10s|%-10s|%-10s|%-10s|%-12s|%-10s|%-10s|%-13s|"
  81.           % ('X', 'Y', 'Y\'', 'F(x)H\'', 'Погрешность\'', 'Y\'\'', 'F(x)H\'\'',
  82.              'Погрешность\'\''))
  83.     print("-" * 94)
  84.     for x in (Decimal(1.0), Decimal(1.2), Decimal(4.8), Decimal(5.0)):
  85.         y = func(x)
  86.         q = Decimal((x - ys[0][0])/h)
  87.         print("|%-10.6f|%-10.6f" % (x, y), sep="", end="")
  88.         if x <= (a + b)/2:
  89.             y_polynominal = lambda x: Decimal(calc_polyominal(ys, x, h))
  90.             y_polynominal_fd = lambda x: Decimal(calc_diff(y_polynominal, x, eps))
  91.         else:
  92.             y_polynominal = lambda x: Decimal(calc_polyominal(ys, x, h, 1))
  93.             y_polynominal_fd = lambda x: Decimal(calc_diff(y_polynominal, x, eps))
  94.         y_fd = Decimal(func_fd(x))
  95.         print('|%-10f' % y_fd, sep='', end='')
  96.         y_poly_fd = Decimal(y_polynominal_fd(x))
  97.         print('|%-10f' % y_poly_fd, sep='', end='')
  98.         print('|%-12f' % abs(y_poly_fd-y_fd), sep='', end='')
  99.         y_sd = Decimal(calc_diff(func_fd, x, Decimal(10**(-7))))
  100.         print('|%-10f' % y_sd, sep='', end='')
  101.         y_poly_sd = Decimal(calc_diff(y_polynominal_fd, x, eps))
  102.         print('|%-10f' % y_poly_sd, sep='', end='')
  103.         print('|%-13f|' % abs(y_poly_sd-y_sd), sep='', end='')
  104.         if x <= (a + b)/2:
  105.             print('|%-10f' % first_diff(q), sep='')
  106.         else:
  107.             print()
  108.    
  109.    
  110. if __name__ == "__main__":
  111.           main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement