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
#----------------------------------------------#
# Program för att lösa ekvationer av typen 
# x^b-b^x=0 med hjälp av Newton-Raphsons metod
#
# 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 math.log
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

# Definiera en funktion som beräknar derivatan 
# av f(a,b) m.a.p. a
def f_prim(a, b):
  return b*a**(b-1)-b**a*math.log(b)

# Lös ekvationen för olika värden på y
#y=1.1
#y=2.0
y=2.1
#y=2.5
#y=3.0
#y=3.5
#y=4.0
#y=5.0
#y=6.0
#y=7.0
#y=8.0
#y=9.0
#y=10.0
#y=17
#y=25
#y=100
#y=200

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

xArray=[]
fArray=[]

err=10 # Startvärde för residualen

# Bestäm lämplig startgissning: Se avsnittet
# "Anpassning till en enklare ekvation" i
# Nämnaren-artikeln 
x0=3/(y-1)+1 

print('Residual:')
while (err > tol) and (AntalIterationer < MaxAntalIterationer):
  x1=x0-f(x0,y)/f_prim(x0,y)
  err=abs(x1-x0)
  x0=x1
  print(err)
  AntalIterationer=AntalIterationer+1 
#endfor

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

# Skapa array
# 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,x0*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