xiangwei27 发表于 2009-4-24 14:05

请问各位大侠我编的分段函数哪 出错了,谢谢!

我写了M文件:
function a=sat(a,b,c)
if a>b, a=b;
elseif a<-c, a=-c;
else a=a;
end

然后我想调用它,x=0:0.01:5;plot(x,sat(sin(x),0.5,0.5))画出来的还是正弦图,没有调用我M文件!请问如何才能调用!
万分感谢!

[ 本帖最后由 ChaChing 于 2009-4-26 11:29 编辑 ]

无水1324 发表于 2009-4-24 21:38

输入的是a,输出的也是a这个怎么搞咯

ChaChing 发表于 2009-4-24 22:14

回复 楼主 xiangwei27 的帖子

LZ输入的a为1*501的向量, 当a>b比较时其ans亦为1*501的向量, 且并非全为1, 所以a>b及a<-c都不会成立!
试试下式
function a=sat(a,b,c)
a(find(a>b))=b;
a(find(a<-c))=-c;


[ 本帖最后由 ChaChing 于 2009-4-24 22:17 编辑 ]

xiangwei27 发表于 2009-4-25 11:39

谢谢ChaChing大侠,再问一个与之相关的问题

编写 function a=sat(a,b,c)
         a(find(a>b))=b;
         a(find(a<-c))=-c;
在命令窗口输入 x=0:0.01:10, 确实可以画出plot(x,sat(sin(x),0.5,0.5))这样一个分段图象,于是我在M文档编辑窗口中输入
clear all;x=0:0.01:10;plot(x,sat(sin(x),0.5,0.5)),保存为00.m并执行却得不到图形,并且提示我work\00.m is not found from a legal MATLAB identifier,
请问如何才能在M文档中 执行!万分感谢!

ChaChing 发表于 2009-4-25 13:00

回复 地板 xiangwei27 的帖子

M文档不要保存为"00.m"! 00与输入数字怎识别!?

xiangwei27 发表于 2009-4-25 15:43

哦,谢谢大侠啊 !

xiangwei27 发表于 2009-4-25 19:15

分段函数sat(a,b,c)给出了,
function a=sat(a,b,c)
a(find(a>b))=b;a(find(a<-c))=-c;
现在我需要把它的等价形式给出,思路如下
function d=ly(a,b,c)
if a>b, d=b/a;
else a<-c, d=-c/a
else d=a/a
end
这样,就可得sat(a,b,c)=a*ly(a,b,c),即 x=0:0.01:10, plot(x,sat(sin(x),0.5,0.5)), 与x=0:0.01:10, plot(x,sin(x)*ly(sin(x),0.5,0.5))的图像是一样的,我用你的方法编写
function d=ly(a,b,c)
d(find(a>b))=b/a;d(find(a<-c))=-c/a; d(find(a<=b&a>=-c))=a/a;
但不能运行,请问如何编写ly(a,b,c)的 M文件? 万分感谢!

[ 本帖最后由 ChaChing 于 2009-4-26 11:30 编辑 ]

ChaChing 发表于 2009-4-25 21:41

回复 7楼 xiangwei27 的帖子

怎还犯同前错误!? a是向量, b/c是纯量, b/a想要干嘛?
几点意见
1.版块错误!
2.给齐完整格式:出错代码和出错提示!
3.最好使用文字交代函数目的, LZ想normalize吗?

xiangwei27 发表于 2009-4-26 10:23

ChaChing先生,谢谢回复!

我是为了做如下问题:
function dx=lorzen3(t,x);dx=[-15*x(1)+15*x(2);      35*x(1)-x(2)-x(1)*x(3);      x(1)*x(2)-4*x(3)];这是一个混沌系统,我 现在加入sat(u)这个控制器,受控的lorzen3就变成了function dx=lorzen3(t,x);dx=[-15*x(1)+15*x(2);   35*x(1)-x(2)-x(1)*x(3)+sat(-1.5*abs(10*(-15*x(1)+15*x(2))+35*x(1)-x(2)-x(1)*x(3))*x(4)*sign(10*x(1)+x(2)),5,5);   x(1)*x(2)-4*x(3);1.5*abs(10*(-15*x(1)+15*x(2))+35*x(1)-x(2)-x(1)*x(3))*x(4)*x(4)*x(4)*abs(10*x(1)+x(2))];
其中function a=sat(a,b,c)a(find(a>b))=b; a(find(a<-c))=-c;
执行如下clear al1=ode45(@lorzen3,0:0.01:10,[-10 -10 100.01]); plot(t,x(:,1),'k') 画不出完整的时间历程图, 理论上是能实现的, 我把受控的sat(u)去掉,图形还是一样,说明没有起到作用,请教如何 处理?还有就是关于如何对变量运算进行编程?我也知道变量在这里不能运算,想问问如何处理这方面的问题,如下 是 错误 提示
function d=ly(a,b,c)
d(find(a>b))=b/a; d(find(a<-c))=-c/a;
d(find(a<=b&a>=-c))=1;
>> x=0:0.01:10;plot(x,sin(x)*ly(sin(x),0.5,0.5))
??? Error using ==> mrdivide
Matrix dimensions must agree.Error in ==> ly at 2
d(find(a>b))=b/a;
万分感谢!

[ 本帖最后由 ChaChing 于 2009-4-26 11:41 编辑 ]

ChaChing 发表于 2009-4-26 11:55

混沌没学过! 对个人而言太高深了!
ly函数的报错原因, 8F已给过了, 因不懂LZ具体要做什麽, 该如何修改也就无法建议! sorry

[ 本帖最后由 ChaChing 于 2009-4-26 11:57 编辑 ]

xiangwei27 发表于 2009-4-26 15:14

ChaChing先生:很感谢你的帮助!~。^

我 的意思是问 对于
function d=ly(a,b,c)
d(find(a>b))=b/a; d(find(a<-c))=-c/a;
d(find(a<=b&a>=-c))=1;
a 是变元,是不能和b(一个确定的值)进行计算的,怎样编程能让如下命令执行:
.x=-10:0.01:10; plot(x, ly(sin(x),0.5,0.5)

[ 本帖最后由 ChaChing 于 2009-4-26 20:38 编辑 ]

ChaChing 发表于 2009-4-26 20:41

是否个人表述不好!? LZ都不明白个人意思!?
b/a想要干嘛? 不懂LZ具体要做什麽?! 怎修改!
仅凭猜测, 自己试试! 看是否LZ要的
function d=ly(a,b,c)
d=ones(size(a)); ind= find(a>b);
d(ind)=b./a(ind); d(ind)=-c./a(ind);

[ 本帖最后由 ChaChing 于 2009-4-26 20:45 编辑 ]

xiangwei27 发表于 2009-4-28 18:20

谢谢啊!sat(u,b,c)是饱和控制,这里sat(u,b,c)=u*ly(u,b,c),由实数的稠密性,一定存在一个常数d,使得0<d<ly(u,b,c),这是对饱和控制的 一种等价控制!
我更改了 你的程序:
function a=ly(u,b,c)
a=ones(size(u));
ind=find(u>b);a(ind)=b./u(ind);
ind=find(u<-c);a(ind)=-c./u(ind);
ind=find(u<=b &u>=-c);a(ind)=1;

得到执行程序
x=-10:0.01:10; plot(x, sin(x).*ly(sin(x),0.5,0.5)) 和x=-10:0.01:10; plot(x, sat(sin(x),0.5,0.5))一样的!
谢谢CHACHING先生!

ChaChing 发表于 2009-4-28 21:14

回复 13楼 xiangwei27 的帖子

解决问题就好!
还是希望大家了解, 每个人专业各有差异, 问问题需有技巧些!

还有LZ的最後一行是多馀的! (ind=find(u<=b &u>=-c);a(ind)=1;)
因a已经预设为1 (a=ones(size(u)); )
页: [1]
查看完整版本: 请问各位大侠我编的分段函数哪 出错了,谢谢!