Advertisement
Guest User

Untitled

a guest
Nov 21st, 2019
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.30 KB | None | 0 0
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3.  
  4. def funkcja(x, c):
  5.     return np.arctan(2*x) + c + x
  6.  
  7. def pochodna(x):
  8.     return 2/(4*(x*x)+1)+1
  9.  
  10. def pprzegiecia(x):
  11.     return (-16*x)/pow(1+4*pow(x, 2),2)
  12.  
  13. def metoda_newtona(x, c):
  14.     return x - funkcja(x, c)/pochodna(x)
  15.  
  16. def punkt_staly(x, c):
  17.     return -np.arctan(2*x)-c
  18.  
  19. def pochodna_stalego(x):
  20.     return -2/(1+4*x*x)
  21. show_data = True
  22. epsilon = 1.0e-7
  23. bstart = 14
  24. astart = 0.0001
  25. dystart = 0.1
  26. imax = 1000
  27. istart = 0
  28. c = -4
  29. pi = np.pi
  30. metody = ["newtona", "bisekcji", "punktu stalego"]
  31. xes = np.arange(astart, bstart, 0.01)
  32.  
  33. for metoda in metody:
  34.     a=astart
  35.     b=bstart
  36.     dy=dystart
  37.     i = istart
  38.     if metoda == "newtona":
  39.         if a > b:
  40.             print("Początek przedziału nie może być większy od jego konca")
  41.             exit(10)
  42.         elif funkcja(a, c)*funkcja(b, c)>0:
  43.             print('Brak jednego miejsca zerowego w przedziale')
  44.             exit(1)
  45.         elif pochodna(a)*pochodna(b)<0:
  46.             print("pierwsza pochodna nie ma stałego znaku")
  47.             exit(1)
  48.         elif pprzegiecia(a)*pprzegiecia(b)<0:
  49.             print("druga pochodna nie ma stałego znaku")
  50.             exit(1)
  51.  
  52.         while dy > epsilon and i < imax:
  53.             x = metoda_newtona(a, c)
  54.             if show_data:
  55.                 print(x)
  56.             dy = abs(funkcja(x, c))
  57.             a = x
  58.             i += 1
  59.  
  60.     elif metoda == "bisekcji":
  61.         if a > b:
  62.             print("Początek przedziału nie może być większy od jego konca")
  63.             exit(10)
  64.         elif funkcja(a, c)*funkcja(b, c)>0:
  65.             print('Brak jednego miejsca zerowego w przedziale')
  66.             exit(1)
  67.         while dy > epsilon and i < imax:
  68.             x = (a+b)/2
  69.             if funkcja(a, c) * funkcja(x, c) < 0:
  70.                 b = x
  71.             elif funkcja(a, c) * funkcja(x, c) > 0:
  72.                 a = x
  73.             if show_data:
  74.                 print(x)
  75.             dy = abs(b-a)
  76.             i += 1            
  77.  
  78.     elif metoda == "punktu stalego":
  79.         if a > b:
  80.             print("Początek przedziału nie może być większy od jego konca")
  81.             exit(10)
  82.         elif funkcja(a, c)*funkcja(b, c)>0:
  83.             print('Brak jednego miejsca zerowego w przedziale')
  84.             exit(1)
  85.         while dy > epsilon and i < imax:
  86.             z = punkt_staly(a, c)
  87.             dy = abs(a-z)
  88.             a = z
  89.             i += 1  
  90.     print("Miejsce zerowe z podaną dokładnością minimalną używając metody {} znajduje sie w miejscu {} po {} krokach".format(metoda, a, i))
  91.  
  92.  
  93.  
  94. fig, axs = plt.subplots(2, 2)
  95. full = np.arange(-6, 6, 0.01)
  96. axs[0, 0].plot(full, funkcja(full, c))
  97. axs[0, 1].plot(full, pochodna(full))
  98. axs[1, 0].plot(full, pprzegiecia(full))
  99. axs[1, 1].plot(xes, funkcja(xes, c))
  100. axs[1, 1].axvline(a, color="red")
  101. axs[0, 0].set(title="Arctan(2x)+x+c")
  102. axs[0, 1].set(title="2/(4*(x*x)+1)+1")
  103. axs[1, 0].set(title="(-16*x)/pow(1+4*pow(x, 2),2)")
  104. axs[1, 1].set(title="Rozwiązanie pokazane na przedziale (a, b)")
  105. axs[0, 0].grid(True)
  106. axs[1, 0].grid(True)
  107. axs[0, 1].grid(True)
  108. axs[1, 1].grid(True)
  109. plt.show()
  110. plt.plot(full, full)
  111. plt.plot(full, punkt_staly(full, c))
  112. plt.show()
  113. plt.plot(np.arange(-100, 100, 0.01), pochodna_stalego(np.arange(-100, 100, 0.01)))
  114. plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement