You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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));

代码说明

  1. 提前定义a和b,确保内积计算使用正确的积分区间[-π, π]。
  2. gramschmidt添加normalized=true参数,直接生成标准正交基,符合书中的展开要求。
  3. 用map(lambda([v], ip(sin(u), v)), e)计算目标函数与每个标准正交基的内积,得到展开系数。
  4. 通过map实现系数与基向量的元素级相乘,再求和得到近似展开式,最终转为浮点数并展开。

运行修正后的代码,将得到与书中一致的结果:0.987862*u - 0.155271*u^3 + 0.00564312*u^5(变量u对应书中的x)。

内容的提问来源于stack exchange,提问作者akond

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 16:29:56