Maple绘制函数时卡在Evaluating状态的问题排查与解决
问题分析与解决
核心问题点
- 未定义冗余变量:代码中
PlotFunc里使用了T和Ts,但全程未定义这两个变量,导致替换操作无效,还让表达式冗余复杂,拖慢计算。 - 奇异函数处理负担:正弦函数的Fourier变换是狄拉克δ函数的组合,直接对
abs(Fhat)和abs(Ghat)绘图时,Maple需要处理奇异函数的可视化,计算量极大甚至卡住。 - 垂直直线语法错误:原代码中垂直直线的plot写法不符合规范,增加了绘图解析的额外负担。
修正后的代码
restart; a := 1/9; b := 1/11; c := 9/2; w := sqrt(a*b); n := 8*w; alpha := a*b*c^(1/n); omega := w; sigma := 2*sqrt(a*b)/(a + b); g := t -> piecewise(0 < t, a*sin(omega*t), t < 0, b*sin(alpha*t)); f := t -> a*sin(omega*t) + b*sin(alpha*t); `tau__*` := max(1/alpha, 1/omega); # 简化Fourier变换表达式,降低计算复杂度 Fhat := simplify(fourier(f(t), t, xi)); Ghat := simplify(fourier(g(t), t, xi)); # 导入绘图工具包 with(plots); # 重写绘图函数:替换奇异函数为可绘制的脉冲形式,修正绘图逻辑 PlotFunc := proc(k) local FhatPlot, GhatPlot, VLines, pulse_height, xi_max; pulse_height := max(a*Pi, b*Pi); # 匹配Fourier变换中delta函数的系数 xi_max := max(alpha, omega) + 1; # 处理Fhat:将delta函数替换为窄矩形脉冲,只保留正频率部分 Fhat_abs := abs(Fhat); Fhat_abs := subs(Dirac(xi - omega)=pulse_height, Dirac(xi - alpha)=pulse_height, Fhat_abs); FhatPlot := plot(Fhat_abs, xi=0..xi_max, color=red, legend="|Fhat(xi)|", discont=true); # 处理Ghat:同样替换delta函数为脉冲 Ghat_abs := abs(Ghat); Ghat_abs := subs(Dirac(xi - omega)=pulse_height, Dirac(xi - alpha)=pulse_height, Ghat_abs); GhatPlot := plot(Ghat_abs, xi=0..xi_max, color=blue, legend="|Ghat(xi)|", discont=true); # 用verticalline命令高效绘制垂直虚线 VLines := display(verticalline(omega, 0, pulse_height, color=black, linestyle=3), verticalline(alpha, 0, pulse_height, color=black, linestyle=3)); display([FhatPlot, GhatPlot, VLines], axes=boxed, legend=true, yrange=[0, pulse_height+0.1]); end proc; # 生成并展示动画 animation := animate(PlotFunc, [k], k=1..20, frames=20); display(animation);
关键修正说明
- 移除无效变量替换:删除原代码中无意义的
subs(T=k*Ts, ...)操作,因为T和Ts从未定义,且tau变量未被使用,直接清理冗余代码。 - 简化Fourier变换:用
simplify()处理变换结果,让表达式更简洁,减少计算负担。 - 替换奇异函数:将狄拉克δ函数替换为固定高度的窄脉冲(模拟脉冲效果),避免Maple解析奇异函数的可视化逻辑,大幅提升绘图速度。
- 修正垂直直线绘制:使用
plots[verticalline]命令绘制垂直虚线,语法规范且高效,避免原代码的错误列表绘图方式。 - 固定y轴范围:手动指定y轴范围,避免绘图时自动调整范围导致的额外计算。
内容的提问来源于stack exchange,提问作者Latyos
相关产品推荐
相关产品推荐

