作业帮 > 数学 > 作业

MATLAB作图,此图由一条曲线封闭而成,现需要分析离圆心最近的各点包围的线(即内边界)并提取该封闭环.

来源:学生作业帮 编辑:作业帮 分类:数学作业 时间:2024/05/17 05:14:59
MATLAB作图,此图由一条曲线封闭而成,现需要分析离圆心最近的各点包围的线(即内边界)并提取该封闭环.
如图所示,(1)怎样把该线提取出来?(2)又如何获得该近似圆的圆度误差?答出(1)或(2)均采纳!
坐等大神慷慨解救.
由函数可知,5圈后图像重叠
我们只用分析x=0~10pi的部分就可以了

dx=0.001*pi; %取样间隔
x=(0:dx:10*pi-dx)';   %x=0~10pi
y=1-0.1*cos(1.6*x);
xx=(0:dx:2*pi-dx)';    %xx=0~2pi
yy=reshape(y,[length(x)/5 5]);   %将0~10pi 分5段每段,每段都是0~2pi,组合成二维矩阵
miny=min(yy,[],2);                      %求出最小值,就是内包络

outx=[xx;2*pi];
outy=[miny;0.9];
subplot(4,1,[1 2 3]),polar(outx,outy);  %极坐标
subplot(4,1,4),plot(outx,outy);             %直角坐标


再问: 我非常非常非常非常感谢您的回答!真的真的很棒!好人一生平安!恳求您再多多费心,因为我还有一点程序也弄不出来。就是我想分析这个近似圆的圆度误差,具体原理就一个式子,如图。想根据这个式子计算数据。麻烦您了,真的谢谢您!第二张图是书上别人写得代码,不过那是在人工输入若干半径值的基础上计算的,我想在做出的这个包络圆上分析所有点,然后得出它的圆度误差。
再问:
再问:
再问: 劳您费心,定当追加财富值犒赏。
再答: 先建个函数文件 f.m,存在工作目录下,内容如下function [out] = f( datax,datay,xy )
r=sqrt((datax-xy(1)).^2+(datay-xy(2)).^2);
out=max(r)-min(r);
end其中输入 datax,datay为包络的直角坐标x,y数据,而xy是个二元数据xy(1) xy(2)分别代表可能中心的x坐标和y坐标所以r就是每点到可能中心的距离根据定义输出out=max(r)-min(r)就是圆度误差

然后在原来求出的outx和outy包络线的数据前提下,寻找中心注意原来的outx,outy是极坐标,首先得先转换为直角坐标ox,oy
ox=outy.*cos(outx);  %转换为直角坐标oy=outy.*sin(outx);
oxymin=fminsearch(@(xy) f(ox,oy,xy),[0 0]); %使用 fminsearch寻找让圆度误差最小的点errormin=f(ox,oy,oxymin);                             %计算以这点为中心的圆度误差
运行后你会发现oxymin是[0 0],errormin=0.0191表明寻找到最合适的圆心是(0,0),这时候圆度误差约为显然该包络线的圆心是(0,0)没有错
你也可以用其他的点作为初始起点,例如oxymin=fminsearch(@(xy) f(ox,oy,xy),[0.1 0.1]);这个时候因为有计算误差,oxymin不再返回[0 0] 但也是很接近[0 0]的数而圆度误差会比0.0191稍微大一点,这是由于计算误差带来的
其实如果只要获得圆度误差,上边的都可以跳过因为随便都看得出圆心就是坐标原点那么圆度误差就是最大半径-最小半径max(outy)-min(outy)就可以求出
再问: 恕我愚笨,麻烦您了! (1)您的第一次回答倒数第三行“outy=[miny;0.9];”中0.9是什么意思呀? (2)我需要把函数y=1-0.1*cos(1.6*x);中的1.6改为1.7等其他我需要计算的数,但出现了错误??? Error using ==> polar THETA and RHO must be the same size.怎么办?
再答: (1)在分0~2pi的区间统计的时候,其实是[0,2pi) 因为0和2pi其实是同一个位置,所以最终统计出内包络线的角度坐标是 0,dx,2dx,3dx,..........,2pi-2dx,2pi-dx 如果用极坐标画图的时候,最后一点就没有连接回开始的那点,没有形成闭合曲线 最后我在outx后面多加了个2pi,在outy后面多加了个0.9(就是x等于2pi时y的值) 只是多加一点,让曲线连接回开始的那点,计算圆度误差可以不要这点 outx=xx; outy=miny; (2)1.6=16/10每隔10pi就是5圈函数取值刚好循环,所以只用计算10pi的以内数据 而1.7=17/10要隔20pi就是10圈才能取值循环所以要将范围改到20pi统计 dx=0.001*pi; %取样间隔 x=(0:dx:20*pi-dx)'; %x=0~20pi y=1-0.1*cos(1.7*x); xx=(0:dx:2*pi-dx)'; %xx=0~2pi yy=reshape(y,[length(x)/10 10]);