声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1587|回复: 13

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

[复制链接]
发表于 2009-4-24 14:05 | 显示全部楼层 |阅读模式

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

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

x
我写了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 编辑 ]
回复
分享到:

使用道具 举报

发表于 2009-4-24 21:38 | 显示全部楼层
输入的是a,输出的也是a这个怎么搞咯
发表于 2009-4-24 22:14 | 显示全部楼层

回复 楼主 xiangwei27 的帖子

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

[ 本帖最后由 ChaChing 于 2009-4-24 22:17 编辑 ]
 楼主| 发表于 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文档中 执行!万分感谢!
发表于 2009-4-25 13:00 | 显示全部楼层

回复 地板 xiangwei27 的帖子

M文档不要保存为"00.m"! 00与输入数字怎识别!?
 楼主| 发表于 2009-4-25 15:43 | 显示全部楼层
哦,谢谢大侠啊 !
 楼主| 发表于 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 编辑 ]
发表于 2009-4-25 21:41 | 显示全部楼层

回复 7楼 xiangwei27 的帖子

怎还犯同前错误!? a是向量, b/c是纯量, b/a想要干嘛?
几点意见
1.版块错误!
2.给齐完整格式:出错代码和出错提示!
3.最好使用文字交代函数目的, LZ想normalize吗?
 楼主| 发表于 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
[t,x]=ode45(@lorzen3,0:0.01:10,[-10 -10 10  0.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 编辑 ]
发表于 2009-4-26 11:55 | 显示全部楼层
混沌没学过! 对个人而言太高深了!
ly函数的报错原因, 8F已给过了, 因不懂LZ具体要做什麽, 该如何修改也就无法建议! sorry

[ 本帖最后由 ChaChing 于 2009-4-26 11:57 编辑 ]
 楼主| 发表于 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 编辑 ]
发表于 2009-4-26 20:41 | 显示全部楼层
是否个人表述不好!? LZ都不明白个人意思!?
b/a想要干嘛? 不懂LZ具体要做什麽?! 怎修改!
仅凭猜测, 自己试试! 看是否LZ要的
  1. function d=ly(a,b,c)
  2. d=ones(size(a)); ind= find(a>b);
  3. d(ind)=b./a(ind); d(ind)=-c./a(ind);
复制代码

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

评分

2

查看全部评分

 楼主| 发表于 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先生!

评分

1

查看全部评分

发表于 2009-4-28 21:14 | 显示全部楼层

回复 13楼 xiangwei27 的帖子

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

还有LZ的最後一行是多馀的! (ind=find(u<=b &u>=-c);a(ind)=1;)
因a已经预设为1 (a=ones(size(u)); )
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-11-19 05:42 , Processed in 0.076397 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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