Matlab与Desmos绘制双曲线的图形差异问题排查
问题根源:Matlab代码的逻辑与公式错误,和Desmos无关
你的问题完全出在Matlab代码的编写上,不是Desmos的操作导致的差异。我帮你拆解一下代码里的两处关键错误:
1. 距离公式符号写错,导致根号下表达式可能为负
双曲线的定义依赖两点间的距离公式,正确形式是sqrt((x1-x2)^2 + (y1-y2)^2)——平方项之间是加号,但你代码里的deltaD表达式把加号写成了减号:
% 错误写法:平方项用了减号 deltaD = sqrt((95-x).^2-(0-y).^2)-sqrt((0-x).^2-(0-y).^2);
当|y| > |95-x|或者|y| > |x|时,根号里的结果会是负数,Matlab无法计算实数解,自然会出现图形间断、绘制异常的情况。
2. deltaD的定义逻辑错误,导致方程不是标准双曲线
TDoA中的deltaD是固定的距离差常数(比如两个接收站收到信号的距离差),但你把它定义成了关于x、y的函数(两个距离的差),再代入双曲线标准方程,最终得到的f是一个复杂的隐函数,而非标准的双曲线方程。这种情况下fcontour无法正确解析出双曲线的完整图形。
修正后的Matlab代码
下面是调整后的代码,按照TDoA的正确逻辑定义双曲线,能得到和Desmos一致的图形:
function TDoACalculation() syms x y; % 两个基站的坐标 s1x = 95; s1y = 0; s2x = 0; s2y = 0; % 两基站(焦点)之间的距离 D = sqrt((s1y - s2y).^2 + (s1x - s2x).^2); % 设定固定的距离差deltaD(根据你的实际场景调整数值) deltaD_val = 30; % 双曲线参数计算 a = deltaD_val / 2; b_squared = (D^2 / 4) - a^2; % 双曲线中心坐标(两焦点的中点) center_x = (s1x + s2x) / 2; center_y = (s1y + s2y) / 2; % 平移后的双曲线标准方程 f = ((x - center_x).^2 / a^2) - ((y - center_y).^2 / b_squared) - 1; disp(f); figure % 调整绘图范围以显示完整双曲线 fcontour(f, [-100 200 -100 100]); grid on; title('TDoA 双曲线'); xlabel('x'); ylabel('y'); end
验证说明
把deltaD_val设为和你Desmos里一致的常数,运行修正后的代码,就能得到和Desmos完全一致的连续双曲线图形了。
内容的提问来源于stack exchange,提问作者Bikki Geisler
相关产品推荐
相关产品推荐

