Asymptote绘图指南:从基础到进阶

需积分: 27 13 下载量 122 浏览量 更新于2024-07-22 1 收藏 722KB PDF 举报
"Asymptote绘图入门讲义,详细介绍了Asymptote的基本绘图命令和技巧,包括2D绘图、画线段和点、画虚线以及画箭头等,适合初学者学习使用。" Asymptote是一种强大的矢量图形编程语言,特别适合于数学和科学领域的图形绘制。本讲义主要关注2D绘图,讲解了Asymptote的基础绘图操作。 首先,Asymptote的绘图基于四个基本命令:draw、fill、clip和label。draw用于绘制线条和形状,fill用于填充颜色,clip用于剪切图形,而label则用于在图形上添加文字标签,支持 LaTeX 语法,能方便地生成数学公式。例如,代码中的`draw(unitcircle)`命令绘制了一个半径为1的单位圆,`fill(unitcircle,yellow)`对其进行填充,`label("$O$",(0,0))`则在原点标注了字母“O”。 接着,讲义介绍了如何画线段和点。`pair`类型用于存储二维坐标,如`pair A=(0,0), B=(1,0), C=(0,1);`。`draw(A--B--C)`将画出由点A、B、C构成的三角形边。`dot`函数用于绘制点,加`UnFill`参数可绘制空心点。 在画虚线部分,Asymptote提供了多种线型,如`solid`(实线)、`dashed`(虚线)、`dashdotted`(点划线)和`dotted`(实心点线)。这些线型可以通过参数传递给`draw`函数来改变线条样式。 最后,讲义提到了画箭头的技巧。`draw((0,3)--(2,3),Arrow)`使用`Arrow`参数在直线上添加箭头,这在表示向量或方向时非常有用。 Asymptote的强大还在于其丰富的图形对象和自定义功能,例如曲线、弧线、曲线上的点、曲线的参数化表示等。它还支持高级的几何构造和变换,如旋转、平移、缩放等,使得绘制复杂的数学图形变得简单。 通过深入学习和实践Asymptote,你可以创建出精确、清晰且具有专业水准的2D图形,这对于学术报告、教学材料以及工程文档的制作都极具价值。随着对Asymptote语言的掌握加深,用户可以绘制更复杂、更具动态效果的图形,进一步提升可视化表达的能力。

%% 求解根轨迹与渐近线 % 创建系统模型 num = 10 * conv([2 5], conv([1 6 34], [1])); den = conv([1 7], [50 644 996 -739 -3559]); sys = tf(num, den); % 计算系统的增益值 K = dcgain(sys); % 绘制根轨迹 figure; rlocus(sys); hold on; % 计算并绘制渐近线 p = pole(sys); z = zero(sys); if isempty(z) z = 0; % 若不存在零点则认为有一个零点在原点 end theta_p = angle(p - 7); theta_z = angle(z - 7); zeta = 0.6; T = 0.1; for i = 1:length(p) a = real(p(i)); b = imag(p(i)); sin_theta_a = sqrt(1 - zeta^2); K = abs(prod(-1-p/7)) / abs((a - p(i))*(a - conj(p(i)))); sigma_a = real(roots(den)); jw_intersection = imag(p(i)) - imag(p(i)) / tan(theta_p(i)); if ~isempty(z) y_asymptote = imag(tf([0 1], [1 sigma_a], T)) - imag(z(i)) + (imag(p(i)) / tan(theta_p(i))); else y_asymptote = jw_intersection / sin_theta_a; end plot([a-sigma_a,a+sigma_a],[b+jw_intersection,b+jw_intersection],'r--'); plot([a-sigma_a,a+sigma_a],[b+y_asymptote,b+y_asymptote],'m--'); end % 计算并输出渐近线与实轴的交点 sigma_a = real(roots(den)); disp(['Intersection of asymptotes and axis: sigma_a = ' num2str(sigma_a)]); % 计算并输出渐近线与实轴的夹角 angle_d = (180/pi)*angle(-10); % 在此,我默认第一个极点在左侧,因此角度为负 disp(['Angle between asymptotes and axis: ' num2str(angle_d) ' deg']); % 计算并输出分离点 zp = pole(sys(sys.num{1}==0)); % 零点为0的极点 if isempty(zp) fprintf('No breakaway/ break-in points.\n'); else fprintf('Breakaway/ Break-in point(s): \n'); for i = 1:length(zp) fprintf('%g + %gi\n', real(zp(i)), imag(zp(i))); end end % 计算并输出根轨迹与虚轴的交点 p1 = pole(sys); z1 = zero(sys); ImAxisCrossings = []; for k = 1:length(p1) if real(p1(k)) < 0 && imag(p1(k)) == 0 continue; % 跳过实部为负的极点,因为它们并不与虚轴相交 end if ~isempty(z1) M = abs(prod((-1)*z1)); N = ((K*abs(conv([1 -p1(k)], [1 -conj(p1(k))])))/abs(den(end))); % 计算二次项系数 kz = N/M; else kz = K; end s = [p1(k) zeros(1, length(z1))]; for i = 1:100 % 改为100步 s = [roots(conv([1 -s(end)], [1 -s(1:end-1)])) s(end)]; if ~isempty(find(abs(imag(s))<1e-3 & imag(s.*conj(s))>1e-3, 1)) ImAxisCrossings = [ImAxisCrossings real(s(find(abs(imag(s))<1e-3 & imag(s.*conj(s))>1e-3, 1)))]; end end end if isempty(ImAxisCrossings) fprintf('No intersection with imaginary axis.\n'); else end fprintf('Intersection(s) with imaginary axis: \n');

2023-06-09 上传