声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3279|回复: 9

[编程技巧] 求助!如何画直线?

[复制链接]
发表于 2006-11-16 10:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
在已经画出来的图上面,如何画自定斜率的直线来逼近已知曲线??比如斜率为1 ,2,4等等!!
请大家帮忙!!做控制系统分析的朋友可加  22007614讨论!!请求信息:matlab

[ 本帖最后由 plsdd 于 2006-11-17 10:32 编辑 ]

这是我由得到的数据画出来的图

这是我由得到的数据画出来的图

这个是需要实现的直线逼近效果

这个是需要实现的直线逼近效果
回复
分享到:

使用道具 举报

发表于 2006-11-16 20:11 | 显示全部楼层
没太明白楼主的意思,建议详细说明一下
 楼主| 发表于 2006-11-17 10:27 | 显示全部楼层
帖子已经编辑过了,把图给贴上来了。详细说明下:
第一副图为bode图,是我由得到的数据画出来的,而不是用matlab自带的bode命令(因为我要做系统识别,所以不知道传函)。
现在我要在第一副图上面一张画出渐近线逼近,效果就是第二幅图那样的,不能用bodeasym命令,只能用别的方法来实现,该如何实现??            理论上讲,要作的直线斜率已经规定好了,只有0,-20 ,-40,-60这几种

请大家帮忙看看
发表于 2006-11-17 10:50 | 显示全部楼层
不好意思,还不是很明白你要实现的问题

不知道你要逼近哪个线

如何判断逼近程度?是否只需要比较0,-20 ,-40,-60着几种情况哪个更加接近?
发表于 2006-11-17 16:23 | 显示全部楼层
不是有专门的逼近函数吗?
 楼主| 发表于 2006-11-18 11:39 | 显示全部楼层
就是要逼近第一个图中的上面一个下降的曲线,逼近函数除了bodeasym还有其他的吗,因为我不能根据已经知道的函数来逼近,而是根据上面那个得到的图来逼近,逼近程度不用考虑,因为我要求是认为的加载直线上去逼近的,请帮忙哦
发表于 2006-11-18 16:25 | 显示全部楼层
原帖由 plsdd 于 2006-11-18 11:39 发表
就是要逼近第一个图中的上面一个下降的曲线,逼近函数除了bodeasym还有其他的吗,因为我不能根据已经知道的函数来逼近,而是根据上面那个得到的图来逼近,逼近程度不用考虑,因为我要求是认为的加载直线上去逼近的 ...



楼主要的应该是这个吧
http://forum.vibunion.com/forum/thread-27694-1-1.html
 楼主| 发表于 2006-11-23 16:09 | 显示全部楼层
function [sun]=main(n)
fplot('1/(x+2)',[-1,1],'r');
x=ones(n+2,1);
for j=0:n+1
    x(j+1)=cos(pi*(n+1-j)/(n+1));
end
first=ones(n+2,1);
f=1./(x+2);  %原函数                                               注意::  这里出现了原函数。而我是没有函数只有数据,要作渐近线                                                                                              也是为了最终辨识出系统模型,即它的函数模型
last=first;
for j=2:n+2
   last(j)=(-1)*last(j-1);
end
A=ones(n+2,n+2);
A(:,1)=first;
A(:,n+2)=last;
for j=2:n+1
    for t=2:j
        A(:,j)=x.*A(:,j);
    end
end
e=(1e-15)*first; %精度控制条件
sun=A\f;
while (1)   
    at='';
    for i=1:n
        for t=1:i
            if (t==1)
                at=strcat('(',num2str(sun(t+1)),')');
            elseif (t>1)
                xt='t';j=2;
                while j<t
                    xt=strcat('t*',xt);j=j+1;
                end
                at=strcat(num2str(t),'*(',num2str(sun(t+1)),')*',xt,'+',at);
            end
        end
    end
    %以下得到逼近函数
    ap1=sun(1:n+1,[1]);
    for i=1:n+1
        ap(i)=ap1(n+2-i);
    end
    yt=strcat('-1/(t+2)^2=',at);
    [y]=solve(yt,'t');
    y=numeric(y);
    %以下得到一组新的交错点组
    for i=1:n+1
        if y(i) < 1 & y(i)>-1
            for j=2:n+2
                if y(i)<x(j)&y(i)>x(j-1)
                    if (1/(x(j-1)+2)-polyval(ap,x(j-1)))*(1/(y(i)+2)-polyval(ap,y(i)))> 0
                        x(j-1)=y(i);
                    elseif (1/(x(j-1)+2)-polyval(ap,x(j-1)))*(1/(y(i)+2)-polyval(ap,y(i)))< 0
                        x(j)=y(i);
                    end
                end
            end
        end   
    end
    A=ones(n+2,n+2);
    A(:,1)=first;
    A(:,n+2)=last;
    for j=2:n+1
        for t=2:j
           A(:,j)=x.*A(:,j);
       end
    end
    f=1./(x+2);
    sun1=A\f;
    if(abs(sun1-sun)<e)
        break;
    end
    sun=sun1;
end
hold on;
funcion=poly2sym(ap);
ezplot(funcion,[-1,1]);
num=num2str(n);
legend('原函数曲线',strcat(num,'次逼近函数曲线'));
title('最佳逼近比较示意图');
xlabel('x的取值');
ylabel('f(x)的取值');
grid on;
end


happy说的是这个吧,我的问题根他的类似,但是有本质的区别,他是已经有原函数(在程序里面我已经标注出来了),再作图,再画渐近线,可我是没有原函数,只有原始作图的数据(各个点的数据),由数据得到的图再作渐近线,我的问题就是这样的!!   
依然谢谢happy教授哦!!                另外说明的是,这个东西应该对大家做系统识别很重要,方法上完全符合系统识别最基础的理论,如果有做这方面的(控制系统分析及系统识别),欢迎大家一起探讨!!我的qq :  22007614

[ 本帖最后由 plsdd 于 2006-11-23 16:16 编辑 ]
发表于 2006-11-23 16:15 | 显示全部楼层
把里边的原函数换你的数据就行了

他没有对原函数做什么处理,这里之所以有个原函数是为了获取作图需要的数据
 楼主| 发表于 2006-11-28 11:01 | 显示全部楼层
这个程序有问题  
??? Undefined function or method 'numeric' for input arguments of type 'sym'.

Error in ==> main at 45
    y=numeric(y);

什么问题啊,查了没numeric这个函数啊    这里到底需要的是个什么功能的函数啊?
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-19 18:25 , Processed in 0.079368 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表