Skip to content

Commit a5dd07c

Browse files
Maclaurin approximation of cos (TheAlgorithms#7507)
* renamed maclaurin_sin.py to maclaurin_series.py and included function for cos approximation * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * attempt to fix pytest error Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent cc10b20 commit a5dd07c

File tree

2 files changed

+121
-64
lines changed

2 files changed

+121
-64
lines changed

maths/maclaurin_series.py

+121
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
"""
2+
https://en.wikipedia.org/wiki/Taylor_series#Trigonometric_functions
3+
"""
4+
from math import factorial, pi
5+
6+
7+
def maclaurin_sin(theta: float, accuracy: int = 30) -> float:
8+
"""
9+
Finds the maclaurin approximation of sin
10+
11+
:param theta: the angle to which sin is found
12+
:param accuracy: the degree of accuracy wanted minimum
13+
:return: the value of sine in radians
14+
15+
16+
>>> from math import isclose, sin
17+
>>> all(isclose(maclaurin_sin(x, 50), sin(x)) for x in range(-25, 25))
18+
True
19+
>>> maclaurin_sin(10)
20+
-0.544021110889369
21+
>>> maclaurin_sin(-10)
22+
0.5440211108893703
23+
>>> maclaurin_sin(10, 15)
24+
-0.5440211108893689
25+
>>> maclaurin_sin(-10, 15)
26+
0.5440211108893703
27+
>>> maclaurin_sin("10")
28+
Traceback (most recent call last):
29+
...
30+
ValueError: maclaurin_sin() requires either an int or float for theta
31+
>>> maclaurin_sin(10, -30)
32+
Traceback (most recent call last):
33+
...
34+
ValueError: maclaurin_sin() requires a positive int for accuracy
35+
>>> maclaurin_sin(10, 30.5)
36+
Traceback (most recent call last):
37+
...
38+
ValueError: maclaurin_sin() requires a positive int for accuracy
39+
>>> maclaurin_sin(10, "30")
40+
Traceback (most recent call last):
41+
...
42+
ValueError: maclaurin_sin() requires a positive int for accuracy
43+
"""
44+
45+
if not isinstance(theta, (int, float)):
46+
raise ValueError("maclaurin_sin() requires either an int or float for theta")
47+
48+
if not isinstance(accuracy, int) or accuracy <= 0:
49+
raise ValueError("maclaurin_sin() requires a positive int for accuracy")
50+
51+
theta = float(theta)
52+
div = theta // (2 * pi)
53+
theta -= 2 * div * pi
54+
return sum(
55+
(((-1) ** r) * ((theta ** (2 * r + 1)) / factorial(2 * r + 1)))
56+
for r in range(accuracy)
57+
)
58+
59+
60+
def maclaurin_cos(theta: float, accuracy: int = 30) -> float:
61+
"""
62+
Finds the maclaurin approximation of cos
63+
64+
:param theta: the angle to which cos is found
65+
:param accuracy: the degree of accuracy wanted
66+
:return: the value of cosine in radians
67+
68+
69+
>>> from math import isclose, cos
70+
>>> all(isclose(maclaurin_cos(x, 50), cos(x)) for x in range(-25, 25))
71+
True
72+
>>> maclaurin_cos(5)
73+
0.28366218546322675
74+
>>> maclaurin_cos(-5)
75+
0.2836621854632266
76+
>>> maclaurin_cos(10, 15)
77+
-0.8390715290764525
78+
>>> maclaurin_cos(-10, 15)
79+
-0.8390715290764521
80+
>>> maclaurin_cos("10")
81+
Traceback (most recent call last):
82+
...
83+
ValueError: maclaurin_cos() requires either an int or float for theta
84+
>>> maclaurin_cos(10, -30)
85+
Traceback (most recent call last):
86+
...
87+
ValueError: maclaurin_cos() requires a positive int for accuracy
88+
>>> maclaurin_cos(10, 30.5)
89+
Traceback (most recent call last):
90+
...
91+
ValueError: maclaurin_cos() requires a positive int for accuracy
92+
>>> maclaurin_cos(10, "30")
93+
Traceback (most recent call last):
94+
...
95+
ValueError: maclaurin_cos() requires a positive int for accuracy
96+
"""
97+
98+
if not isinstance(theta, (int, float)):
99+
raise ValueError("maclaurin_cos() requires either an int or float for theta")
100+
101+
if not isinstance(accuracy, int) or accuracy <= 0:
102+
raise ValueError("maclaurin_cos() requires a positive int for accuracy")
103+
104+
theta = float(theta)
105+
div = theta // (2 * pi)
106+
theta -= 2 * div * pi
107+
return sum(
108+
(((-1) ** r) * ((theta ** (2 * r)) / factorial(2 * r))) for r in range(accuracy)
109+
)
110+
111+
112+
if __name__ == "__main__":
113+
print(maclaurin_sin(10))
114+
print(maclaurin_sin(-10))
115+
print(maclaurin_sin(10, 15))
116+
print(maclaurin_sin(-10, 15))
117+
118+
print(maclaurin_cos(5))
119+
print(maclaurin_cos(-5))
120+
print(maclaurin_cos(10, 15))
121+
print(maclaurin_cos(-10, 15))

maths/maclaurin_sin.py

-64
This file was deleted.

0 commit comments

Comments
 (0)