python - 为什么 SymPy 不简化表达式?

标签 python sympy symbolic-math

我只是在查看 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 * sin(x) 相同。 但是我想知道为什么不将其简化为该表达式。我尝试了几个可用的简化函数,但没有一个给出预期的结果。

我的代码有问题还是我的期望值过高?

最佳答案

不知道这是否适合您,但我会简单地使用 .evalf每个 Sympy 表达式的方法

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]:                                                                                  

关于python - 为什么 SymPy 不简化表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54743646/

相关文章:

python - sympy solveset 在一种情况下返回 FiniteSet 但在另一种情况下返回补码

python - 为什么 numpy 不会计算一个 5 元素列表而不是另一个的标准偏差?

matlab - 为什么 "pi"在 MATLAB 中成为符号?

algorithm - 符号与数值数学 - 性能

python - Pandas 就地条件值乘法

python - 如何避免在 Django 1.6 的功能测试中多次创建管理员?

python - 将 sympy 中的计算结果分配给函数

octave - 符号工具箱从符号名称中修剪最终的 "dot"

python - 如何使用 convert_coreml 转换自定义管道(分类 get_dummies)?

python - 在条目小部件 tkinter 中键入声音