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
#----------------------------------------------#
# Program för att lösa ekvationen x^y=y^x 
# genom att kurvanpassa till en enklare 
# ekvation av typen y(x)=a/(x-b)+b
#
# 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 matplotlib för att kunna 
# skapa en graf
import matplotlib.pyplot as plt 

# Importera curvefit för att kunna 
# göra icke-linjär kurvanpassning
from scipy.optimize import curve_fit

# Definiera en funktion som beräknar x(k)
def x(k):
  return k**(1/(k-1))

# Definiera en funktion som beräknar y(k)
def y(k):
  return k**(k/(k-1))

# Definiera en funktion som beräknar func(x,a,b)
def func(x,a,b):
  return a/(x-b)+b

# Ange största x-värde du vill visa i grafen
max_value=50

# Beräkna x- och y-värden med funktionerna 
# x och y
# Skapa arrayer. Syntax för linspace: 
# linspace(startvärde, slutvärde, antal värden)
mArray1=np.linspace(1/max_value,0.9999,1000) 
#mArray2=np.linspace(1.05,max_value,1000)  
#mArray=np.append(mArray1,mArray2)
xArray=x(mArray1)
yArray=y(mArray1)

# Skriv ut största och minsta värden för x och y
#print(min(xArray))
#print(max(xArray))
#print(min(yArray))
#print(max(yArray))

# Kontrollera att xArray består av ökande 
# värden. Annars fungerar inte interp
# print(np.all(np.diff(xArray) > 0))

# Interpolera för att få värden jämnt 
# fördelade längs kurvan, så att 
# kurvanpassningen blir bättre:
# xArray[::-1] innebär att ordningen på 
# elementen i arrayen xArray byter plats, 
# så att första elementet kommer sist och 
# sista kommer först o.s.v.

xinterp = np.linspace(np.e, max(xArray), 1000)
yinterp = np.interp(xinterp, xArray[::-1], yArray[::-1])
#plt.plot(xArray, yArray, ',')
#plt.plot(xinterp, yinterp, '-x')
#plt.show()

# Definiera max och min-värden för grafen
xmin=0.5
#xmin=5
xmax=max_value*1.1
#xmax=20
ymin=0.5
ymax=np.e

#plt.plot(xArray, yArray, 'b.', label='x^y=y^x')
plt.plot(xinterp, yinterp, 'b,', label='x^y=y^x')

# Gör kurvanpassning för parametrarna 
# a, b, c för funktionen func
popt0=[3,1] # Startgissning för parametrarna
popt, pcov = curve_fit(func, xinterp, yinterp, popt0)
plt.plot(xArray, func(xArray, *popt), 'r-', label='y=a/(x-b)+b')
#plt.plot(xArray, func(xArray, round(100*popt[0])/100, round(100*popt[1])/100), 'g-', label='approx')

plt.xlabel('x')
plt.ylabel('y')
plt.grid(True)
plt.legend()
plt.axis([xmin,xmax,ymin,ymax])
plt.show()
plt.savefig('graph.png')

print('Optimerade värden:')
print(popt)
Python 3.6.1 (default, Dec 2015, 13:05:11) [GCC 4.8.2] on linux