This repository has been archived by the owner on Mar 9, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
askisi5_2392.py
122 lines (90 loc) · 4.44 KB
/
askisi5_2392.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
114
115
116
117
118
119
120
121
122
import numpy
from pylab import *
sin = numpy.sin
pi = numpy.pi
# Τα σημεία που επέλεξα από την συναρτηση του ημιτόνου
x_my_sin_points = [0.380799109526036, 0.761598219052071, 1.39626340159546, 2.66559376668225,
2.91945983969961, 3.2367924309713, 3.80799109526036,
5.20425449685582, 5.83891967939921, 6.09278575241657]
y_my_sin_points = [sin(i) for i in x_my_sin_points]
# Τα 200 δοκιμαστικά σημεία
x_test_points = numpy.linspace(-pi, pi, 200)
y_test_points = [sin(i) for i in x_test_points]
def polyonimiki_prosegisi_newton(x_points, y_points):
# Επιστρέφει το πολυώνυμο(προσσέγγιση της συναρτησης) που περνάει απο τα σημεία που περνει σαν όρισμα,
# με την μέθοδο του Newton
# Η μορφη της επιστρεφόμενης μεταβλητής είναι: numpy.poly1d
# όπου αποτελεί δομή δεδομένων που προσομοιάζει τα πολυώνυμα
# πλήθος των σημείων k
n = len(x_points)
# Το πολυώνυμο 1x+0 (μεταβλητή x σε συμβατή μορφη)
x = numpy.poly1d([1, 0])
# Διαιρεμένες διαφορές υπολογισμένες στον πίνακα Dij
Dij = coef(x_points, y_points)
N = 0
for j in range(0, n):
nj = 1
for i in range(0, j):
nj = numpy.polymul(numpy.polyadd(x, -x_points[i]), nj)
N = numpy.polyadd(numpy.polymul(Dij[j], nj), N)
return N
def coef(x, y):
# συνάρτηση για τον υπολογισμό των διαιρεμένων διαφορών για την πολυωνυμική προσσέγιση Newton
n = len(x)
a = []
for i in range(n):
a.append(y[i])
for j in range(1, n):
for i in range(n - 1, j - 1, -1):
a[i] = (a[i] - a[i - 1]) / (x[i] - x[i - j])
return numpy.array(a)
def methodos_elaxistwn_tetragwnwn(x_points, y_points):
# προσέγγιση των σημειών με πολυώνυμο 1ου βαθμού
# με την μέθοδο των ελαχίστων τετραγώνων
x_meso = numpy.mean(x_points)
y_meso = numpy.mean(y_points)
sum_arith = 0
sum_paron = 0
for i in range(len(x_points)):
# Δημιουργούμε το άθροισμα του αριθμητή
sum_arith += (x_points[i] - x_meso) * (y_points[i] - y_meso)
# Δημιουργούμε το άθροισμα του παρονομαστή
sum_paron += (x_points[i] - x_meso) ** 2
b = sum_arith / sum_paron
a = y_meso - b * x_meso
eutheia_proseggisis = numpy.poly1d([b, a])
return eutheia_proseggisis
polyonimo_newton = polyonimiki_prosegisi_newton(
x_my_sin_points, y_my_sin_points)
elax_tetr_eutheia = methodos_elaxistwn_tetragwnwn(
x_my_sin_points, y_my_sin_points)
sum_sfalma_newton = 0
sum_sfalma_leastsq = 0
y_sfalma_newton = []
y_sfalma_leastsq = []
for point in x_test_points:
# Υπολογισμός του σφάλματος για 200 σημεια μεταξύ -π και π
interp_newton = polyonimo_newton(point)
interp_leastsq = elax_tetr_eutheia(point)
correct_result = sin(point)
sfalma_newton = abs(interp_newton - correct_result)
sfalma_leastsq = (interp_leastsq - correct_result) ** 2
y_sfalma_newton.append(sfalma_newton)
y_sfalma_leastsq.append(sfalma_leastsq)
sum_sfalma_newton = sum_sfalma_newton + sfalma_newton
sum_sfalma_leastsq = sum_sfalma_leastsq + sfalma_leastsq
avg_sfalma_newton = sum_sfalma_newton / len(x_test_points)
final_sfalma_leastsq = numpy.sqrt(sum_sfalma_leastsq)
print("Μέσο σφάλμα πολυωνυμικής προσέγισης Newton:", avg_sfalma_newton)
print("Σφάλμα προσέγισης με την μέθοδο των ελάχιστων τετραγώνων:",
final_sfalma_leastsq)
subplot(3, 1, 1)
scatter(x_test_points, y_test_points)
title('Τα σημεία που θέλουμε να προσσεγγίσουμε')
subplot(3, 1, 2)
scatter(x_test_points, y_sfalma_newton, color='green')
title('Σφάλμα πολυωνυμικής προσσέγγισης Newton')
subplot(3, 1, 3)
scatter(x_test_points, y_sfalma_leastsq, color='red')
title('Σφάλμα προσέγγισης με την μέθοδο ελάχιστων τετραγώνων')
show()