Я просто смотрю на модуль Python SymPy и в качестве простого (бесполезного) примера пытаюсь подобрать функцию f (x) функцией, установленной g_i (x) в заданном интервале.
import sympy as sym
def functionFit(f, funcset, interval):
N = len(funcset) - 1
A = sym.zeros(N+1, N+1)
b = sym.zeros(N+1, 1)
x = sym.Symbol('x')
for i in range(N+1):
for j in range(i, N+1):
A[i,j] = sym.integrate(funcset[i]*funcset[j],
(x, interval[0], interval[1]))
A[j,i] = A[i,j]
b[i,0] = sym.integrate(funcset[i]*f, (x, interval[0], interval[1]))
c = A.LUsolve(b)
u = 0
for i in range(len(funcset)):
u += c[i,0]*funcset[i]
return u, c
x = sym.Symbol('x')
f = 10*sym.cos(x)+3*sym.sin(x)
fooset=(sym.sin(x), sym.cos(x))
interval = (1,2)
print("function to approximate:", f)
print("Basic functions:")
for foo in fooset:
print(" - ", foo)
u,c = functionFit(f, fooset, interval)
print()
print("simplified u:")
print(sym.simplify(u))
print()
print("simplified c:")
print(sym.simplify(c))
Результатом является функция подгонки u (x), которая должна быть возвращена вместе с коэффициентами functionFit
.
В моем случае
f(x) = 10 * sym.cos(x) + 3 * sym.sin(x)
, и я хочу подгонятьэто согласно линейной комбинации sin (x), cos (x).Таким образом, коэффициенты должны быть 3 и 10.
Результат в порядке, но для u (x) я получаю
u(x) = (12*sin(2)**2*sin(4)*sin(x) + 3*sin(8)*sin(x) + 12*sin(2)*sin(x) + 40*sin(2)**2*sin(4)*cos(x) + 10*sin(8)*cos(x) + 40*sin(2)*cos(x))/(2*(sin(4) + 2*sin(2))) :
Function to approximate: 3*sin(x) + 10*cos(x)
Basic functions:
- sin(x)
- cos(x)
Simplified u: (12*sin(2)**2*sin(4)*sin(x) + 3*sin(8)*sin(x) + 12*sin(2)*sin(x) + 40*sin(2)**2*sin(4)*cos(x) + 10*sin(8)*cos(x) + 40*sin(2)*cos(x))/(2*(sin(4) + 2*sin(2)))
Simplified c: Matrix([[3], [10]])
, который действительно равен 10 * cos (x) +3 * грех (х).Однако мне интересно, почему это не упрощается до этого выражения.Я пробовал несколько доступных функций упрощения, но ни одна из них не дает ожидаемого результата.
Что-то не так в моем коде или мои ожидания высоки?