import numpy as np
def pade_approximation(C, L, M, return_coeffs=False):
assert len(C) >= L + M + 1, "Недостаточно коэффициентов ряда"
C = np.array(C[:L + M + 1], dtype=float)
A = np.zeros((M, M))
b = np.zeros(M)
for i in range(1, M + 1):
for j in range(1, M + 1):
idx = L + i - j
if 0 <= idx < len(C):
A[i - 1, j - 1] = C[idx]
b[i - 1] = -C[L + i]
try:
q_sol = np.linalg.solve(A, b)
except np.linalg.LinAlgError:
raise ValueError("Система уравнений Паде не имеет единственного решения")
q_coeffs = np.zeros(M + 1)
q_coeffs[0] = 1.0
q_coeffs[1:] = q_sol
p_coeffs = np.zeros(L + 1)
for n in range(L + 1):
s = C[n]
for i in range(1, min(n, M) + 1):
s += q_coeffs[i] * C[n - i]
p_coeffs[n] = s
if return_coeffs:
return p_coeffs.tolist(), q_coeffs.tolist()
else:
def approx_func(x):
P = sum(p_coeffs[n] * (x ** n) for n in range(L + 1))
Q = sum(q_coeffs[n] * (x ** n) for n in range(M + 1))
return P / Q
return approx_func
if __name__ == "__main__":
coeffs_log = [0, 1, -1/2, 1/3, -1/4]
p, q = pade_approximation(coeffs_log, 2, 2, return_coeffs=True)
print("Коэффициенты числителя P:", p)
print("Коэффициенты знаменателя Q:", q)