使用Gram-Schmidt与Maxima实现sin(x)近似时结果异常的问题排查
问题分析与修正方案
错误点总结
- 冗余的目标函数列表:
sl: makelist(sin(u), x, 1, 6)生成了6个重复的sin(u),完全没必要,只需将目标函数与每个正交基单独计算内积。 - 错误的列表乘法逻辑:
map(ip, sl, e)*e不是元素级乘法,Maxima中列表直接相乘会导致错误结果,需用map逐个关联系数与基向量。 - 未使用标准正交基:默认
gramschmidt生成的是正交基(仅满足两两正交,但模长不为1),而书中的近似基于标准正交基,需添加归一化选项。 - 全局变量赋值时机错误:
a和b的赋值放在re行末尾,导致gramschmidt调用时积分范围未定义,需提前赋值。
修正后的代码
load("eigen"); a: -%pi; b: %pi; ip(f, g) := integrate(f * g, u, a, b); basis: makelist(u^k, k, 0, 5); e: gramschmidt(basis, ip, normalized=true); inner_products: map(lambda([v], ip(sin(u), v)), e); expansion: apply("+", map(lambda([c, v], c*v), inner_products, e)); expand(float(expansion));
代码说明
- 提前定义
a和b,确保内积计算使用正确的积分区间[-π, π]。 gramschmidt添加normalized=true参数,直接生成标准正交基,符合书中的展开要求。- 用
map(lambda([v], ip(sin(u), v)), e)计算目标函数与每个标准正交基的内积,得到展开系数。 - 通过
map实现系数与基向量的元素级相乘,再求和得到近似展开式,最终转为浮点数并展开。
运行修正后的代码,将得到与书中一致的结果:0.987862*u - 0.155271*u^3 + 0.00564312*u^5(变量u对应书中的x)。
内容的提问来源于stack exchange,提问作者akond
相关产品推荐
相关产品推荐

