- Notifications
You must be signed in to change notification settings - Fork 46.7k
/
Copy pathpolynom_for_points.py
103 lines (89 loc) · 3.84 KB
/
polynom_for_points.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
defpoints_to_polynomial(coordinates: list[list[int]]) ->str:
"""
coordinates is a two dimensional matrix: [[x, y], [x, y], ...]
number of points you want to use
>>> points_to_polynomial([])
Traceback (most recent call last):
...
ValueError: The program cannot work out a fitting polynomial.
>>> points_to_polynomial([[]])
Traceback (most recent call last):
...
ValueError: The program cannot work out a fitting polynomial.
>>> points_to_polynomial([[1, 0], [2, 0], [3, 0]])
'f(x)=x^2*0.0+x^1*-0.0+x^0*0.0'
>>> points_to_polynomial([[1, 1], [2, 1], [3, 1]])
'f(x)=x^2*0.0+x^1*-0.0+x^0*1.0'
>>> points_to_polynomial([[1, 3], [2, 3], [3, 3]])
'f(x)=x^2*0.0+x^1*-0.0+x^0*3.0'
>>> points_to_polynomial([[1, 1], [2, 2], [3, 3]])
'f(x)=x^2*0.0+x^1*1.0+x^0*0.0'
>>> points_to_polynomial([[1, 1], [2, 4], [3, 9]])
'f(x)=x^2*1.0+x^1*-0.0+x^0*0.0'
>>> points_to_polynomial([[1, 3], [2, 6], [3, 11]])
'f(x)=x^2*1.0+x^1*-0.0+x^0*2.0'
>>> points_to_polynomial([[1, -3], [2, -6], [3, -11]])
'f(x)=x^2*-1.0+x^1*-0.0+x^0*-2.0'
>>> points_to_polynomial([[1, 5], [2, 2], [3, 9]])
'f(x)=x^2*5.0+x^1*-18.0+x^0*18.0'
>>> points_to_polynomial([[1, 1], [1, 2], [1, 3]])
'x=1'
>>> points_to_polynomial([[1, 1], [2, 2], [2, 2]])
Traceback (most recent call last):
...
ValueError: The program cannot work out a fitting polynomial.
"""
iflen(coordinates) ==0ornotall(len(pair) ==2forpairincoordinates):
raiseValueError("The program cannot work out a fitting polynomial.")
iflen({tuple(pair) forpairincoordinates}) !=len(coordinates):
raiseValueError("The program cannot work out a fitting polynomial.")
set_x= {xforx, _incoordinates}
iflen(set_x) ==1:
returnf"x={coordinates[0][0]}"
iflen(set_x) !=len(coordinates):
raiseValueError("The program cannot work out a fitting polynomial.")
x=len(coordinates)
# put the x and x to the power values in a matrix
matrix: list[list[float]] = [
[
coordinates[count_of_line][0] ** (x- (count_in_line+1))
forcount_in_lineinrange(x)
]
forcount_of_lineinrange(x)
]
# put the y values into a vector
vector: list[float] = [coordinates[count_of_line][1] forcount_of_lineinrange(x)]
forcountinrange(x):
fornumberinrange(x):
ifcount==number:
continue
fraction=matrix[number][count] /matrix[count][count]
forcounting_columns, iteminenumerate(matrix[count]):
# manipulating all the values in the matrix
matrix[number][counting_columns] -=item*fraction
# manipulating the values in the vector
vector[number] -=vector[count] *fraction
# make solutions
solution: list[str] = [
str(vector[count] /matrix[count][count]) forcountinrange(x)
]
solved="f(x)="
forcountinrange(x):
remove_e: list[str] =solution[count].split("E")
iflen(remove_e) >1:
solution[count] =f"{remove_e[0]}*10^{remove_e[1]}"
solved+=f"x^{x- (count+1)}*{solution[count]}"
ifcount+1!=x:
solved+="+"
returnsolved
if__name__=="__main__":
print(points_to_polynomial([]))
print(points_to_polynomial([[]]))
print(points_to_polynomial([[1, 0], [2, 0], [3, 0]]))
print(points_to_polynomial([[1, 1], [2, 1], [3, 1]]))
print(points_to_polynomial([[1, 3], [2, 3], [3, 3]]))
print(points_to_polynomial([[1, 1], [2, 2], [3, 3]]))
print(points_to_polynomial([[1, 1], [2, 4], [3, 9]]))
print(points_to_polynomial([[1, 3], [2, 6], [3, 11]]))
print(points_to_polynomial([[1, -3], [2, -6], [3, -11]]))
print(points_to_polynomial([[1, 5], [2, 2], [3, 9]]))