Advertisement
Guest User

Untitled

a guest
May 29th, 2016
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.78 KB | None | 0 0
  1. from MMP import TMA
  2. from math import log
  3.  
  4. class Problem:
  5.     """Computational problem using splines"""
  6.     def __init__(self, xList, yList, d1, d2):
  7.         super(Problem, self).__init__()
  8.         self.n = len(yList) - 1;
  9.         self.xList = xList
  10.         self.yList = yList
  11.         self.heights = self.__getHeights()
  12.         self.lambdas = self.__getLambdas()
  13.         self.mus = self.__getMus()
  14.         self.frees = [d1] + self.__getFrees() + [d2]
  15.         self.slopes = self.__getSlopes()
  16.         self.a = self.__getAs();
  17.         self.b = self.__getBs();
  18.  
  19.  
  20.     def __getHeights(self):
  21.         heights = []
  22.         for x in range(0, self.n):
  23.             heights.append(self.xList[x + 1] - self.xList[x])
  24.         return heights
  25.  
  26.  
  27.     def __getLambdas(self):
  28.         lambdas = []
  29.         for i in range(1, self.n):
  30.             lambdas.append(self.heights[i - 1]/(self.heights[i - 1] + self.heights[i]))
  31.         return [0] + lambdas # Нуль из краевых условий
  32.  
  33.  
  34.     def __getMus(self):
  35.         mus = []
  36.         for i in range(1, self.n):
  37.             mus.append(self.heights[i]/(self.heights[i - 1] + self.heights[i]))
  38.         return mus + [0] # Нуль из краевых условий
  39.  
  40.  
  41.     def __getFrees(self):
  42.         frees = []
  43.         for i in range(1, self.n):
  44.             frees.append(3*(self.lambdas[i - 1]*(self.yList[i + 1] - self.yList[i])/self.heights[i]
  45.                             + self.mus[i - 1]*(self.yList[i] - self.yList[i - 1])/self.heights[i - 1]))
  46.         # print(frees)
  47.         return frees
  48.  
  49.  
  50.     def __getSlopes(self):
  51.         m = TMA([0] + self.mus, [1] + ([2] * (self.n - 1)) + [1], self.lambdas + [0], self.frees);
  52.  
  53.         return m.solve()
  54.  
  55.  
  56.     def __getAs(self):
  57.         a = []
  58.         for i in range(0, self.n):
  59.             a.append(6/self.heights[i]*
  60.                 (-(2*self.slopes[i] + self.slopes[i + 1])/3 +
  61.                     (self.yList[i + 1] - self.yList[i])/self.heights[i]))
  62.         return a
  63.  
  64.  
  65.     def __getBs(self):
  66.         b = [];
  67.         for i in range(0, self.n):
  68.             b.append(12/(self.heights[i]**2)*((self.slopes[i] + self.slopes[i + 1])/2 -
  69.                 (self.yList[i] - self.yList[i])/self.heights[i]))
  70.         return b
  71.  
  72.  
  73.     def solve(self, x):
  74.         # print("mus|lambdas|heights|a|b\n",len(self.mus), len(self.lambdas), len(self.heights), len(self.a), len(self.b))
  75.         # print("slopes|frees\n", len(self.slopes), len(self.frees))
  76.  
  77.         i = 0;
  78.         x1 = xList[i];
  79.         while x1 + self.heights[i] < x:
  80.             x1 += self.heights[i]
  81.             i += 1
  82.         diff = x - self.xList[i];
  83.         # print(i)
  84.  
  85.         return self.yList[i] + self.slopes[i]*diff + self.a[i]*diff**2/2  + self.b[i]*diff**3/6
  86.  
  87.     def printSlopes(self):
  88.         for i in range(0, self.n + 1):
  89.             print(self.slopes[i])
  90.  
  91.  
  92.  
  93.  
  94. xList = [
  95. 0.5,
  96. 0.55,
  97. 0.6,
  98. 0.65,
  99. 0.7,
  100. 0.75,
  101. 0.8,
  102. 0.85,
  103. 0.9,
  104. 0.95,
  105. 1
  106. ]
  107.  
  108. yList = [
  109. -0.1479400,
  110. -0.1040401,
  111. -0.0549733,
  112. -0.0007458,
  113. 0.0586362,
  114. 0.1231673,
  115. 0.1928419,
  116. 0.2676551,
  117. 0.3476020,
  118. 0.4326779,
  119. 0.5228787,
  120. ]
  121.  
  122. d1 = 0.8262822
  123. d2 = 1.8552351
  124.  
  125. p = Problem(xList, yList, d1, d2)
  126.  
  127. # x = float(input())
  128.  
  129. def func(x):
  130.     return p.solve(x);
  131.  
  132.  
  133. a = 0.5
  134. b = 1.0
  135. EPS = 1e-5
  136. n = 10
  137.  
  138. def tabulate(a, b, n):
  139.     if (a > b): swap(a, b)
  140.     t = (b - a)/n
  141.     res = []
  142.     for x in range(0, n + 1):
  143.         res.append(a + x*t)
  144.     return res
  145.  
  146. def integral(func, table):
  147.     # print(table)
  148.     summ = 0
  149.     for i in range(1, n + 1):
  150.         summ += func(table[i])*(table[i] - table[i - 1])
  151.     return summ
  152.  
  153.  
  154. I = integral(func, tabulate(a, b, n))
  155. n *= 2
  156. I2 = integral(func, tabulate(a, b, n))
  157. c = 1
  158.  
  159.  
  160. while abs(I - I2) > EPS:
  161.     c += 1
  162.     I = I2
  163.     n *= 2
  164.     I2 = integral(func, tabulate(a, b, n))
  165. print (I2, c)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement