Files
  • main.py
  • graph.png
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#----------------------------------------------#
# Program för att lösa ekvationer av typen 
# x^b-b^x=0 med hjälp av intervallhalvering
#
# Problemställningen och den 
# bakomliggande matematiken finns presenterad i 
# artikeln: 
# "Ekvationen x^y=y^x - 
# Exempel på problemlösning med hjälp 
# av programmering" publicerad i
# Nämnaren 2018:3
#
# Anders Johansson
# Vuxenutbildningen Falkenberg
#----------------------------------------------#

# Importera numpy för att kunna använda arrayer # på ett smidigt sätt, t. ex. linspace
import numpy as np

# Importera math för att kunna använda 
# funktionen copysign
import math

# Importera matplotlib för att kunna 
# skapa en graf
import matplotlib.pyplot as plt

# Definiera en funktion som beräknar f(a,b)
def f(a, b):
  return a**b-b**a

# Testa för olika värden på y
#y=1.1
y=1.9
#y=2.5
#y=3.0
#y=7.2
#y=10.0
#y=100
#y=150
#y=200
#y=300
#y=400
#y=430

tol=1e-14
AntalIterationer=0
MaxAntalIterationer=500

xArray=[]
fArray=[]

# Välj startvärde beroende på vilken 
# gren lösningen ligger
if y < np.e:
  x_min=np.e
  x_max=1000.0
else:
  x_min=1.0+1e-6
  x_max=np.e
#endif
x_medel=(x_min+x_max)/2

# Upprepa intervallhalveringsalgortimen så länge
# intervallets storlek är större än toleransen
while (abs(x_max-x_min) > tol) and (AntalIterationer < MaxAntalIterationer):
  x_medel=(x_min+x_max)/2
#  if (math.copysign(1, f(x_min,y))) == (math.copysign(1, f(x_medel,y))):
  if (np.sign(f(x_min,y)) == np.sign(f(x_medel,y))):
    x_min=x_medel
  else:
    x_max=x_medel
  #endif
  AntalIterationer=AntalIterationer+1 
#endfor

if AntalIterationer==MaxAntalIterationer:
  print('Maxantal iterationer, ingen lösning funnen')
else:
  print('a=', y,'ger b=',x_min)
  print('Antal iterationer: ',AntalIterationer)
#endif

# För att kontrollera resultatet grafiskt, 
# kan nedanstående program användas

# Skapa array med loinspace
# Syntax för linspace: 
# linspace(startvärde, slutvärde, antal värden)

# Välj max- och min-värde beroende på vilken 
# gren lösningen ligger
if y < np.e:
  xArray=np.linspace(np.e,x_max*2,1000)
else:
  xArray=np.linspace(1.0+1e-6,np.e,1000)
#endif

fArray=(f(xArray,y))

# Skapa grafen och visa den
plt.plot(xArray, fArray, 'r-')
xmin=min(xArray)
xmax=max(xArray)
ymin=-2.5
ymax=10
plt.xlabel('x')
plt.ylabel('y')
plt.grid(True)
plt.axis([xmin,xmax,ymin,ymax])
plt.show()
plt.savefig('graph.png')
Python 3.6.1 (default, Dec 2015, 13:05:11) [GCC 4.8.2] on linux