Python 为什么';你不能简化这个表达式吗?

Python 为什么';你不能简化这个表达式吗?,python,sympy,symbolic-math,Python,Sympy,Symbolic Math,我只是看看Python模块SymPy并尝试一下,作为一个简单(无用)的例子,函数集g_I(x)在给定的时间间隔内拟合函数f(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+

我只是看看Python模块SymPy并尝试一下,作为一个简单(无用)的例子,函数集g_I(x)在给定的时间间隔内拟合函数f(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),我得到

这和10*cos(x)+3*sin(x)是一样的。 然而,我想知道为什么不简化为这个表达式。我尝试了几种可用的简化函数,但都没有得到预期的结果


我的代码中是否有错误,或者我的期望值过高?

不知道这是否是您的解决方案,但我只会使用每个Symphy表达式的方法

In [26]: u.simplify()                                                                     
Out[26]: (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)))

In [27]: u.evalf()                                                                        
Out[27]: 3.0*sin(x) + 10.0*cos(x)

In [28]:                                                                                  

有趣。虽然它是用于数值计算,但它简化了表达式。这是标准方法吗?因为所有来自定积分的项都很难简化,但可以在不存在任何问题的情况下进行数值计算,所以它可以工作,然后再次简化得到的表达式,给出最简单的可能形式。W.r.t.“这是一种标准方法吗?”我会说“几乎”——当你看到不依赖符号的复杂表达式时,尝试一下
evalf
通常是值得的。。。
In [26]: u.simplify()                                                                     
Out[26]: (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)))

In [27]: u.evalf()                                                                        
Out[27]: 3.0*sin(x) + 10.0*cos(x)

In [28]: