python - 在多项式基础上应用 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 程序正常工作。
解决方案
这是一个可能的解决方案,但速度不快。我仍在使用循环研究解决方案
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)
推荐阅读
- django - Django内部连接与跨多对多关系的表的搜索词
- java - GreenMail 服务器在单个集成测试类中工作,但不是在所有集成类都将启动时
- flutter - TypeError:无法读取未定义的属性(读取“地图”)Flutter 和 Dart 问题
- asp.net - 如何在多个视图之间传递相同的 id 值?
- pdf - 错误:导入笔记本需要安装 Jupyter nbconvert。朱莉娅
- javascript - 有没有办法在不使用 CDN 的情况下将 jquery 链接到 html?
- c++ - 需要访问其他成员变量的 std::set 类型的成员变量的比较器
- unity3d - 试图统一制作滑动拼图游戏。但是拼图块不动
- python - 使用 Python 连接 Firestore 以存储在 Cloud Shell 中生成的 API 结果时出错
- python - ImportError:导入 cv2 时 DLL 加载失败