-
Notifications
You must be signed in to change notification settings - Fork 0
/
lab12.py
118 lines (90 loc) · 3.55 KB
/
lab12.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
from itertools import takewhile
import os
import numpy as np
import sympy as sy
import computational_math.newtons_system as cmns
DATA_DIR = 'data/' + os.path.basename(__file__)[:-3]
IMG_DIR = f'{DATA_DIR}/img'
def draw_plots():
x, y = sy.symbols('x, y')
func1 = sy.Or(sy.Eq(x**2 + y**2 - 4, 0), sy.Eq(x**4 - y - 4, 0))
func2 = sy.Or(sy.Eq((x-1)**2 + y**2 - 9, 0), sy.Eq(sy.tan(x-1) - y**3, 0))
func3 = sy.Or(sy.Eq(x**2 + y**2 - 4, 0), sy.Eq(x**2 + y**2 - 1, 0))
sy.plot_implicit(func1)
sy.plot_implicit(func2, (x, -4, 6), (y, -5, 5))
sy.plot_implicit(func3)
def main():
eq_systems_names = [
'x^2 + y^2 - 4 = 0\n'
'x^4 - y - 4 = 0',
'(x-1)^2 + y^2 - 9 = 0\n'
'tg(x-1) - y^3 = 0',
'x^2 + y^2 - 4 = 0\n'
'x^2 + y^2 - 1 = 0',
]
eq_systems = np.array([
[
lambda x, y: x**2 + y**2 - 4,
lambda x, y: x**4 - y - 4,
],
[
lambda x, y: (x-1)**2 + y**2 - 9,
lambda x, y: np.tan(x-1) - y**3,
],
[
lambda x, y: x**2 + y**2 - 4,
lambda x, y: x**2 + y**2 - 1,
],
])
df_matricies = np.array([
[
[lambda x, y: 2*x, lambda x, y: 2*y],
[lambda x, y: 4*x**3, lambda x, y: -1],
],
[
[lambda x, y: 2*(x-1), lambda x, y: 2*y],
[lambda x, y: 1/np.cos(x-1)**2, lambda x, y: -3*y**2],
],
[
[lambda x, y: 2*x, lambda x, y: 2*y],
[lambda x, y: 2*x, lambda x, y: 2*y],
],
])
ifname, ofname = f'{DATA_DIR}/input.txt', f'{DATA_DIR}/output.txt'
with open(ifname, 'r', encoding='utf-8') as reader, open(ofname, 'w', encoding='utf-8') as writer:
line_it = map(str.strip, reader)
line_it = filter(lambda s: not s.startswith('#'), line_it)
line_it = takewhile(lambda s: s != '--break', line_it)
while True:
it = takewhile(lambda s: s, line_it)
try:
sys_num = int(next(it))
errors = [*map(float, next(it).split())]
errors = sorted(errors, key=abs, reverse=True)
errors = np.array(errors, float)
except StopIteration:
break
x0_vec_list = np.array([[*map(float, s.split())] for s in it])
sys_name = eq_systems_names[sys_num]
eq_system = eq_systems[sys_num]
df_mx = df_matricies[sys_num]
print(sys_name, '\n', file=writer)
for x0_vec in x0_vec_list:
for err in errors:
x0_str = ', '.join(f'{x:g}' for x in x0_vec)
print(f'точность: {err:g}, (x0, y0): ({x0_str})', file=writer)
(x, y), iters_amount = cmns.find_root(x0_vec, eq_system, df_mx, err)
if iters_amount == cmns.LIMIT:
fmt = f'решение: ({x:g}, {y:g}), метод не сошелся'
print(fmt, file=writer)
residual = np.array([eq(x, y) for eq in eq_system])
print(f'невязка: {residual}\n', file=writer)
break
fmt = f'решение: ({x:g}, {y:g}), число шагов: {iters_amount}'
print(fmt, file=writer)
residual = np.array([eq(x, y) for eq in eq_system])
print(f'невязка: {residual}\n', file=writer)
print(file=writer)
if __name__ == '__main__':
# draw_plots()
main()