Python 用高斯消去多项式逼近正弦函数

Python 用高斯消去多项式逼近正弦函数,python,data-science,polynomials,approximation,polynomial-approximations,Python,Data Science,Polynomials,Approximation,Polynomial Approximations,我试图使用python通过高斯消去法来近似区间上的正弦函数。使用此代码 from copy import deepcopy def convert_to_row_eschelon(A_, B_): A = deepcopy(A_) B = deepcopy(B_) dim = len(A) for cc in range(dim): # pivot_row = A[cc] for r in range(cc + 1, dim):

我试图使用python通过高斯消去法来近似区间上的正弦函数。使用此代码

from copy import deepcopy
def convert_to_row_eschelon(A_, B_):
    A = deepcopy(A_)
    B = deepcopy(B_)
    dim = len(A)
    for cc in range(dim):
        # pivot_row = A[cc]
        for r in range(cc + 1, dim):
            leading_term = A[r][cc]
            for c in range(cc, dim):
                # print(A[r][c], A[r][cc])
                A[r][c] = A[r][c] - A[cc][c] * leading_term / A[cc][cc]
            B[r] = B[r] - B[cc] * leading_term / A[cc][cc]
    return A, B

def back_sub(matrix_pair):
    A = matrix_pair[0]
    B = matrix_pair[1]
    res = [None] * len(B)
    
    for i in range(len(B) - 1, -1, -1):
        def f(j):
            return A[i][j] * res[j]
        res[i] = (B[i] - sum([f(k) for k in range(i + 1, len(B))])) / A[i][i]
    return res


def gaussian_elimination(A, B):
    return back_sub(convert_to_row_eschelon(A, B))
A = [
      [1, 2, 3],
      [4, 5, 7],
      [23, 12, 12]
]
B = [4, 6, 7]
fig = 10
# print(convert_to_row_eschelon(A, B))
def make_polynomial(x_points, y_points):
    # A[x_point index used][degree]
    degree = len(x_points)
    A = []
    for i in range(degree):
        A.append([])
        for j in range(degree):
            A[i].append(x_points[i] ** j) # This is line 45 
    coeff = gaussian_elimination(A, y_points)
    def f(x):
        coeff_f = coeff
        res = 0
        for i in range(len(coeff_f)):
            res += x ** i * coeff_f[i]
        return res
    return f

def generate_x(start, finish, increment):
    x_points = []
    curr = start
    while curr < finish:
        x_points.append(curr)
        curr += increment
    return x_points
from math import sin, pi
start = 0 # These are the intervals
finish = 2 * pi
increment = 0.01
def test_func(x):
    return  sin(x)
# Creating the polynomial
x_val_f = generate_x(start, finish, increment)
x_val_test = generate_x(start, finish, 0.01)

f = make_polynomial(x_val_f, [test_func(i) for i in x_val_f])
print(f(3))
y_val_f = [f(i) for i in x_val_f]
y_val_test = [test_func(i) for i in x_val_test]
error = sum([abs(y_val_f[i] - y_val_test[i]) for i in range(len(y_val_f))]) / len(y_val_f)
print('average error : {}'.format(error))
# plotting f
import matplotlib.pyplot as plt


plt.plot(x_val_test, y_val_test, label = "test_func")
plt.scatter(x_val_f, y_val_f, label = "f(x)", s = 10)
plt.xlabel('x-axis')
plt.ylabel('y-axis')
plt.ylim(-1,1) 
plt.title('Graph')
plt.legend()
plt.show()
这是不是因为我的分数太多,所以
x_点[I]**j
变得太大了?还是我在什么地方出错了?即使我通过增大增量使它工作,一些点也与sin函数不匹配。 . Test_func是正弦函数,f是近似函数

有人知道为什么会这样吗


下面是一个屏幕截图,增量为0.07,间隔与代码中的间隔相同。如果还有其他事情可以帮上忙的话,请告诉我。

在这种情况下,使用调试器找出问题所在是有帮助的。或者至少,使用块捕获异常并打印变量,以查看代码在哪里爆炸

try:
    for i in range(degree):
        A.append([])
        for j in range(degree):
            A[i].append(x_points[i] ** j) # This is line 45 
except:
    print(f"i = {i}; j = {j}")

### output: 
i = 310; j = 628
在这种情况下,当
i=310
j=628
时,代码会中断。这是因为
x_点[i]**j=3.10**628
,它太大了,无法存储在一个双人床中

try:
    for i in range(degree):
        A.append([])
        for j in range(degree):
            A[i].append(x_points[i] ** j) # This is line 45 
except:
    print(f"i = {i}; j = {j}")

### output: 
i = 310; j = 628