如何用Matlab数值函数与ezplot得到一致曲线及问题排查
问题解析与解决思路
首先,咱们先复盘下你遇到的情况:你定义了这个符号函数
f(x)=(2*5^(1/2)*atanh((5^(1/2)*x)/150))/3 - 100/x
用ezplot配合view([90 -90])反转坐标轴能正常得到反函数曲线,但换成数值方法绘制时,不仅弹出“忽略复数虚部”的警告,还画出了两条曲线——你本来觉得atanh在对应区间应该是实值,这确实容易让人困惑。
为什么会出现复数警告和多余曲线?
核心问题出在定义域边界的数值误差上:
atanh(z)的实值定义域是|z| < 1,当z=1时函数趋向正无穷,z>1时结果直接变成复数。你原本设置的vMax=150/5^(1/2),代入(5^(1/2)*x)/150后,刚好等于1,刚好踩在atanh的定义域边界上。- 数值计算里,
vNew的最后一个值可能因为浮点精度问题,略大于vMax(或者说计算(5^(1/2)*x)/150时刚好超过1),这时候atanh就会返回复数,MATLAB自动忽略虚部后,这些异常的实部值就被画成了额外的曲线。 - 另外你设置的
axis([0 vMax 0 3])和函数实际输出范围不匹配,进一步放大了显示异常。
你提到的修正方案为什么有效?
你调整vMax取值,本质是把x的上限设为严格小于150/5^(1/2),确保(5^(1/2)*x)/150始终小于1,完全落在atanh的实定义域内,从根源上避免了复数的产生。同时修正坐标轴范围,让显示区域匹配函数的实际输出,自然就不会有多余曲线了。
给你个更严谨的修正代码参考:
syms f x; % 用sqrt(5)替代5^(1/2),可读性更好 f=(2*sqrt(5)*atanh((sqrt(5)*x)/150))/3 - 100/x; ht=matlabFunction(f); % 给vMax留一点安全余量,比如乘以0.999,确保atanh输入严格小于1 vMax=150/sqrt(5)*0.999; vNew=0.1:0.0001:vMax; y_vals=ht(vNew); plot(vNew,y_vals); % 自动适配函数输出范围,避免手动设置的偏差 axis([0 vMax min(y_vals) max(y_vals)]); view([90 -90]);
这样运行就不会有警告,也能得到和ezplot一致的目标曲线了。
内容的提问来源于stack exchange,提问作者user1773603
相关产品推荐
相关产品推荐

