Advertisement
Guest User

Untitled

a guest
May 24th, 2016
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.78 KB | None | 0 0
  1. #
  2. # Nonlinear equation solvers
  3. #
  4. # Functions:
  5. # - Fixed-point iteration method: fixed_point(f, x0)
  6. # - Bisection method: bisection(f, a0, b0)
  7. # - False position method: false_position(f, a0, b0)
  8. # - Newton method: newton(f, df, x0)
  9. # - Secant method: secant(f, x0, x1)
  10. #
  11. # Usage:
  12. # % python
  13. # >>> import nonlineq
  14. # >>> nonlineq.secant(lambda x: 2 ** x - 1.5, 0.0, 0.1)
  15. #
  16. # Author: Yasunori Yusa
  17. #
  18.  
  19. DEFAULT_TOLERANCE = 1.0E-9
  20. DEFAULT_MAX_ITER = 100
  21.  
  22.  
  23. def fixed_point(f, x0,
  24. tol=DEFAULT_TOLERANCE, xtol=0.0, ftol=0.0,
  25. max_iter=DEFAULT_MAX_ITER):
  26. """
  27. Solve nonlinear equation by fixed-point iteration method.
  28. """
  29. x_new = x0
  30. i = 0
  31. while i < max_iter:
  32. x_old = x_new
  33. f_old = f(x_old)
  34. if abs(f_old) <= ftol:
  35. return x_old, i, True
  36. x_new = x_old + f_old
  37. if abs(x_new - x_old) <= max(tol * abs(x_old), xtol):
  38. return x_new, i, True
  39. i += 1
  40. return x_new, max_iter, False
  41.  
  42.  
  43. def bisection(f, a0, b0,
  44. xtol=DEFAULT_TOLERANCE, ftol=0.0,
  45. max_iter=DEFAULT_MAX_ITER):
  46. """
  47. Solve nonlinear equation by bisection method.
  48. """
  49. a = a0
  50. b = b0
  51. if a > b:
  52. a, b = b, a
  53. fa = f(a)
  54. if fa * f(b) > 0.0:
  55. return float("inf"), 0, False
  56. i = 0
  57. while i < max_iter:
  58. c = 0.5 * (a + b)
  59. fc = f(c)
  60. if abs(fc) <= ftol:
  61. return c, i, True
  62. if fc * fa < 0.0:
  63. b = c
  64. elif fc * fa > 0.0:
  65. a = c
  66. fa = fc
  67. else:
  68. return c, i, False
  69. if b - a <= xtol:
  70. return 0.5 * (a + b), i, True
  71. i += 1
  72. return 0.5 * (a + b), max_iter, False
  73.  
  74.  
  75. def false_position(f, a0, b0,
  76. ftol=DEFAULT_TOLERANCE,
  77. max_iter=DEFAULT_MAX_ITER):
  78. """
  79. Solve nonlinear equation by false position method.
  80. """
  81. a = a0
  82. b = b0
  83. if a > b:
  84. a, b = b, a
  85. fa = f(a)
  86. fb = f(b)
  87. if fa * fb > 0.0:
  88. return None, 0, False
  89. i = 0
  90. while i < max_iter:
  91. if fb - fa == 0.0:
  92. return 0.5 * (a + b), i, False
  93. c = (a * fb - b * fa) / (fb - fa)
  94. fc = f(c)
  95. if abs(fc) <= ftol:
  96. return c, i, True
  97. if fc * fa < 0.0:
  98. b = c
  99. fb = fc
  100. elif fc * fa > 0.0:
  101. a = c
  102. fa = fc
  103. else:
  104. return c, i, False
  105. i += 1
  106. return (a * fb - b * fa) / (fb - fa), max_iter, False
  107.  
  108.  
  109. def newton(f, df, x0,
  110. tol=DEFAULT_TOLERANCE, xtol=0.0, ftol=0.0,
  111. max_iter=DEFAULT_MAX_ITER):
  112. """
  113. Solve nonlinear equation by Newton method.
  114. """
  115. x_new = x0
  116. i = 0
  117. while i < max_iter:
  118. x_old = x_new
  119. f_old = f(x_old)
  120. if abs(f_old) <= ftol:
  121. return x_old, i, True
  122. df_old = df(x_old)
  123. if df_old == 0.0:
  124. return x_old, i, False
  125. x_new = x_old - f_old / df_old
  126. if abs(x_new - x_old) <= max(tol * abs(x_old), xtol):
  127. return x_new, i, True
  128. i += 1
  129. return x_new, max_iter, False
  130.  
  131.  
  132. def secant(f, x0, x1,
  133. tol=DEFAULT_TOLERANCE, xtol=0.0, ftol=0.0,
  134. max_iter=DEFAULT_MAX_ITER):
  135. """
  136. Solve nonlinear equation by secant method.
  137. """
  138. x_old = x0
  139. f_old = f(x_old)
  140. x_new = x1
  141. i = 0
  142. while i < max_iter:
  143. x_old_old = x_old
  144. x_old = x_new
  145. f_old_old = f_old
  146. f_old = f(x_old)
  147. if abs(f_old) <= ftol:
  148. return x_old, i, True
  149. if f_old - f_old_old == 0.0:
  150. return x_old, i, False
  151. x_new = x_old - f_old * (x_old - x_old_old) / (f_old - f_old_old)
  152. if abs(x_new - x_old) <= max(tol * abs(x_old), ftol):
  153. return x_new, i, True
  154. i += 1
  155. return x_new, max_iter, False
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement