Advertisement
lenyaplay

Untitled

Oct 7th, 2021
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.35 KB | None | 0 0
  1. import math
  2. from math import exp
  3.  
  4. a = 1
  5. b = 3
  6.  
  7.  
  8. def f(x):
  9. return exp(-x) - x + 2
  10.  
  11.  
  12. def df(x):
  13. return -(1+exp(x)/x)
  14.  
  15.  
  16. def ddf(x):
  17. return 1 / exp(x)
  18.  
  19.  
  20. def equitonHasOneRoot(a, b, f, df):
  21. if (f(a) > 0 and f(b) < 0) or (f(a) < 0 and f(b) > 0):
  22. if df(a) > 0 and df(b) > 0 or df(a) < 0 and df(b) < 0:
  23. return True
  24. return False
  25.  
  26.  
  27. def getConstC(x, df, eps):
  28. if df(x) < 0:
  29. return -2 / df(x) + eps
  30. if df(x) > 0:
  31. return -2 / df(x) - eps
  32.  
  33.  
  34. def getX0(a, b, f, ddf):
  35. if f(a) * ddf(a) > 0:
  36. return a
  37. if f(b) * ddf(b) > 0:
  38. return b
  39. return max(a, b) # Иначе ничего не сошлось
  40.  
  41.  
  42. eps = 10 ** -3
  43. d = 10 ** -2
  44.  
  45.  
  46. def beatifulPrint(*args, size):
  47. str = ''
  48. for arg in args:
  49. str += f'{arg:<{size}}'
  50. print(str)
  51.  
  52.  
  53. def MPI():
  54. if not equitonHasOneRoot(a, b, f, df):
  55. print("Больше одного корня")
  56. return
  57.  
  58. c = getConstC(a, df, eps)
  59. xn = x0 = a
  60. fn = f(xn)
  61. i = 0
  62. print(f'Метод простых итераций')
  63. beatifulPrint('Итерация', 'xn', 'xn1', '|xn1 - xn|', '|fn1-fn|', size=24)
  64. while True:
  65. i += 1
  66. xn1 = xn + c * f(xn)
  67. fn1 = f(xn1)
  68. if math.fabs(xn1 - xn) < eps and math.fabs(fn1 - fn) < d:
  69. print("Итог: ")
  70. beatifulPrint(i, xn, xn1, math.fabs(xn1 - xn), math.fabs(fn1 - fn), size=24)
  71. print(f'Итоговое значение функции: {fn1}')
  72. break
  73. beatifulPrint(i, xn, xn1, math.fabs(xn1 - xn), math.fabs(fn1 - fn), size=24)
  74. xn = xn1
  75. fn = fn1
  76.  
  77.  
  78. def Newton():
  79. if not equitonHasOneRoot(a, b, f, df):
  80. print("Больше одного корня")
  81. return
  82. xn = x0 = getX0(a, b, f, ddf)
  83. fn = f(xn)
  84. i = 0
  85. print(f'Метод нъютона')
  86. beatifulPrint('Итерация', 'xn', 'xn1', '|xn1 - xn|', '|fn1-fn|', size=24)
  87. while True:
  88. i += 1
  89. xn1 = xn - f(xn) / df(xn)
  90. fn1 = f(xn1)
  91. if math.fabs(xn1 - xn) < eps and math.fabs(fn1 - fn) < d:
  92. print("Итог: ")
  93. beatifulPrint(i, xn, xn1, math.fabs(xn1 - xn), math.fabs(fn1 - fn), size=24)
  94. print(f'Итоговое значение функции: {fn1}')
  95. break
  96. beatifulPrint(i, xn, xn1, math.fabs(xn1 - xn), math.fabs(fn1 - fn), size=24)
  97. xn = xn1
  98. fn = fn1
  99.  
  100.  
  101. def ModNewton():
  102. if not equitonHasOneRoot(a, b, f, df):
  103. print("Больше одного корня")
  104. return
  105. xn = x0 = getX0(a, b, f, ddf)
  106. fn = f(xn)
  107. i = 0
  108. print(f'Модифицированный метод нъютона')
  109. beatifulPrint('Итерация', 'xn', 'xn1', '|xn1 - xn|', '|fn1-fn|', size=24)
  110. while True:
  111. i += 1
  112. xn1 = xn - f(xn) / df(x0)
  113. fn1 = f(xn1)
  114. if math.fabs(xn1 - xn) < eps and math.fabs(fn1 - fn) < d:
  115. print("Итог: ")
  116. beatifulPrint(i, xn, xn1, math.fabs(xn1 - xn), math.fabs(fn1 - fn), size=24)
  117. print(f'Итоговое значение функции: {fn1}')
  118. break
  119. beatifulPrint(i, xn, xn1, math.fabs(xn1 - xn), math.fabs(fn1 - fn), size=24)
  120. xn = xn1
  121. fn = fn1
  122.  
  123.  
  124. MPI()
  125. Newton()
  126. ModNewton()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement