-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
88 lines (69 loc) · 2.77 KB
/
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
from math import *
import matplotlib.pyplot as plt
import sys
def kernel(x, s):
return s + sin(x)
def test(x):
return [*map(lambda x: x, x)]
def f(x):
return [*map(lambda x: x + pi ** 2 * (1 / 2 * sin(x) + 1 / 3 * pi), x)]
def solve(matrix, fn):
n = len(fn) - 1
for i in range(n):
lead, lead_index = abs(matrix[i][i]), i
for j in range(i + 1, n + 1):
if abs(matrix[j][i]) > lead:
lead, lead_index = abs(matrix[i][j]), j
matrix[i], matrix[lead_index] = matrix[lead_index], matrix[i]
for j in range(i + 1, n + 1):
if abs(matrix[j][i]) > sys.float_info.epsilon:
fn[j] = -fn[j] * matrix[i][i] / matrix[j][i] + fn[i]
for m in range(n, i-1, -1):
matrix[j][m] = -matrix[j][m] * matrix[i][i] / matrix[j][i] + matrix[i][m]
for i in range(n, -1, -1):
for j in range(i + 1, n + 1):
fn[i] -= fn[j] * matrix[i][j]
fn[i] /= matrix[i][i]
return fn
def left_rectangle(xn, kernel, h):
n = len(xn) - 1
matrix = [[1.0 if i == j else 0.0 for i in range(n+1)] for j in range(n+1)]
for i in range(n+1):
for j in range(n):
matrix[i][j] += h*kernel(xn[i], xn[j])
return matrix
def simpson(xn, kernel, h):
n = len(xn)-1
matrix = [[1.0 if i == j else 0.0 for i in range(n + 1)] for j in range(n + 1)]
for i in range(n + 1):
for j in range(1, n, 2):
matrix[i][j - 1] += kernel(xn[i], xn[j - 1]) * 2 * h / 6
matrix[i][j] += kernel(xn[i], xn[j]) * 8 * h / 6
matrix[i][j + 1] += kernel(xn[i], xn[j + 1]) * 2 * h / 6
return matrix
def show_plots(x, u_lrq, u_simpson, u):
xu = [x[0] + j * (x[-1] - x[0]) / 10000 for j in range(10001)]
fig, axs = plt.subplots(1, 2, figsize=(7, 4), constrained_layout=True)
fig.suptitle('Численные решения интегрального уравнение', fontsize=12)
axs[0].plot(x, u_lrq, 'o', xu, u(xu), '-')
axs[0].set_title('Квадратурная формула левых прямоугольников', fontsize=8)
axs[0].set_xlabel('x')
axs[0].set_ylabel('U(x)')
axs[1].plot(x, u_simpson, 'o', xu, u(xu), '-')
axs[1].set_xlabel('x')
axs[1].set_ylabel('U(x)')
axs[1].set_title('Квадратурная формула Симпсона', fontsize=8)
n = len(x) - 1
fig.savefig(f'integration{n}.png', dpi=800)
plt.show()
def main():
a, b, n = 0, pi, 32
h = (b-a)/n
print(h)
xn = [a + i*h for i in range(n+1)]
U_left_rectangle = solve(left_rectangle(xn, kernel, h), f(xn))
U_simpson = solve(simpson(xn, kernel, h), f(xn))
print(U_left_rectangle)
show_plots(xn, U_left_rectangle, U_simpson, test)
if __name__ == '__main__':
main()