首页 > 解决方案 > 在多项式基础上应用 Gram-Schmidt 正交化

问题描述

我想在多项式 {1,x,x^2,x^3,x^4,x^5} 的基础上应用 Gram-Schmidt Orthogonization。所以我参考了以下网站:https ://gist.github.com/iizukak/1287876/edad3c337844fac34f7e56ec09f9cb27d4907cc7

import sympy as sp
import numpy as np
from sympy import poly
from sympy import *
x = symbols('x')

def dot_poly(p1, p2, lower_b, upper_b):
    try:
        p = p1*p2
        res = N(integrate(p.as_expr(), (x,lower_b,upper_b)))
        return(res)
    except AttributeError :
        res = p1*p2
        return(res)

def norm(p, lower_b, upper_b):
    res = dot_poly(p,p, lower_b, upper_b)
    return(res)

def gs_v(u, w, lower_b, upper_b):
    res = ((dot_poly(u, w, lower_b, upper_b))/(norm(w, lower_b, upper_b)))*w
    return res

basis = [1,poly(x),poly(x**2),poly(x**3),poly(x**4),poly(x**5)]

def gsp_test(X, lower_b, upper_b):
    Y = []
    for i in range(len(X)):
        temp_vec = X[i]
        for inY in Y :
            proj_vec = gs_v(inY, X[i], lower_b, upper_b)
            
            for i, j in zip(temp_vec, proj_vec):
                tmp = i-j
                print(tmp)
        Y.append(tmp)
    return Y

但出现以下错误:

gsp_test(basis,-pi,pi)


UnboundLocalError                         Traceback (most recent call last)
<ipython-input-232-eebb83c4511a> in <module>
----> 1 gsp_test(basis,-pi,pi)

<ipython-input-231-a5a19f3b3a8b> in gsp_test(X, lower_b, upper_b)
      9                 tmp = i-j
     10                 print(tmp)
---> 11         Y.append(tmp)
     12     return Y

UnboundLocalError: local variable 'tmp' referenced before assignment

我认识到这个问题是由于局部变量和全局变量的不同而发生的,但我仍然无法解决这个问题以使 GS 程序正常工作。

标签: pythonsympylinear-algebra

解决方案


这是一个可能的解决方案,但速度不快。我仍在使用循环研究解决方案

basis = [1,poly(x),poly(x**2),poly(x**3),poly(x**4),poly(x**5)]
on_basis = [1]

lower_b = -pi
upper_b = pi

w2 = basis[1] - gs_v(basis[1], on_basis[0], lower_b, upper_b)
on_basis.append(w2)
w3 = basis[2] - gs_v(basis[2], on_basis[0], lower_b, upper_b)-gs_v(basis[2], on_basis[1], lower_b, upper_b)
on_basis.append(w3)
w4 = basis[3] - gs_v(basis[3], on_basis[0], lower_b, upper_b)-gs_v(basis[3], on_basis[1], lower_b, upper_b)-gs_v(basis[3], on_basis[2], lower_b, upper_b)
on_basis.append(w4)
w5 = basis[4] - gs_v(basis[4], on_basis[0], lower_b, upper_b)-gs_v(basis[4], on_basis[1], lower_b, upper_b)-gs_v(basis[4], on_basis[2], lower_b, upper_b)-gs_v(basis[4], on_basis[3], lower_b, upper_b)
on_basis.append(w5)
w5 = basis[5] - gs_v(basis[5], on_basis[0], lower_b, upper_b)-gs_v(basis[5], on_basis[1], lower_b, upper_b)-gs_v(basis[5], on_basis[2], lower_b, upper_b)-gs_v(basis[5], on_basis[3], lower_b, upper_b)-gs_v(basis[5], on_basis[4], lower_b, upper_b)


推荐阅读