声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3349|回复: 16

[其他相关] 请教:函数和子函数

[复制链接]
发表于 2007-6-15 12:47 | 显示全部楼层 |阅读模式

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

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

x
function dX=M(t,X)
dX=zeros(12,1);
A=9.5;
B=11;
a(1)=3;
a(2)=4;
a(3)=2;
dX(1)=A*(X(2)-g(X(1)))+a(1)*(-3*X(1)+X(4)+X(7)+X(10));
dX(2)=X(1)-X(2)+X(3)+a(2)*(-3*X(2)+X(5)+X(8)+X(11));
dX(3)=-B*X(2)+a(3)*(-3*X(3)+X(6)+X(9)+X(12));
dX(4)=A*(X(5)-g(X(4)))+a(1)*(X(1)-3*X(4)+X(7)+X(10));
dX(5)=X(4)-X(5)+X(6)+a(2)*(X(2)-3*X(5)+X(8)+X(11));
dX(6)=-B*X(5)+a(3)*(X(3)-3*X(6)+X(9)+X(12));
dX(7)=A*(X(8)-g(X(7)))+a(1)*(X(1)+X(4)-3*X(7)+X(10));
dX(8)=X(7)-X(8)+X(9)+a(2)*(X(2)+X(5)-3*X(8)+X(11));
dX(9)=-B*X(8)+a(3)*(X(3)+X(6)-3*X(9)+X(12));
dX(10)=A*(X(11)-g(X(10)))+a(1)*(X(1)+X(4)+X(7)-3*X(10));
dX(11)=X(10)-X(11)+X(12)+a(2)*(X(2)+X(5)+X(8)-3X(11));
dX(12)=-B*X(11)+a(3)*(X(3)+X(6)+X(9)-3*X(12));

我这里的g(x)是个函数
function y=g(X)
if X>6.4
    y=0.1*pi/3.2*(X-6.4);
elseif X<6.4
    y=0.1*pi/3.2*(X+6.4);
else
    y=-0.1*sin(pi*X/3.2+pi);
end
我怎么样可以把他用到上面那段程序里去啊
回复
分享到:

使用道具 举报

发表于 2007-6-15 13:01 | 显示全部楼层
你分别保存这两个函数就可以直接调用的

[ 本帖最后由 mjhzhjg 于 2007-6-16 23:11 编辑 ]

评分

1

查看全部评分

 楼主| 发表于 2007-6-15 15:56 | 显示全部楼层

还是不对诶,能不能说具体点啊,我单独把g(x)做了个m文件但结果是一样的
clear
clc
[t,X] = ode45(@M,[0:100],[0,0,0,0,0,0,0,0,0,0,0,0]);
subplot(2,2,1);
plot(t,X(:,1));
xlabel('t')
ylabel('x11')
subplot(2,2,2);
plot(X(:,1),X(:,4));
xlabel('x11')
ylabel('x21')
subplot(2,2,3);
plot(X(:,1),X(:,7));
xlabel('x11')
ylabel('x31')
subplot(2,2,4);
plot(X(:,1),X(:,10));
xlabel('x11')
ylabel('x41')
这个是要画的图
发表于 2007-6-15 16:01 | 显示全部楼层
第一个m文件
function y=g(X)
if X>6.4
    y=0.1*pi/3.2*(X-6.4);
elseif X<6.4
    y=0.1*pi/3.2*(X+6.4);
else
    y=-0.1*sin(pi*X/3.2+pi);
end

第二个m文件
function dX=M(t,X)
dX=zeros(12,1);
A=9.5;
B=11;
a(1)=3;
a(2)=4;
a(3)=2;
dX(1)=A*(X(2)-g(X(1)))+a(1)*(-3*X(1)+X(4)+X(7)+X(10));
dX(2)=X(1)-X(2)+X(3)+a(2)*(-3*X(2)+X(5)+X(8)+X(11));
dX(3)=-B*X(2)+a(3)*(-3*X(3)+X(6)+X(9)+X(12));
dX(4)=A*(X(5)-g(X(4)))+a(1)*(X(1)-3*X(4)+X(7)+X(10));
dX(5)=X(4)-X(5)+X(6)+a(2)*(X(2)-3*X(5)+X(8)+X(11));
dX(6)=-B*X(5)+a(3)*(X(3)-3*X(6)+X(9)+X(12));
dX(7)=A*(X(8)-g(X(7)))+a(1)*(X(1)+X(4)-3*X(7)+X(10));
dX(8)=X(7)-X(8)+X(9)+a(2)*(X(2)+X(5)-3*X(8)+X(11));
dX(9)=-B*X(8)+a(3)*(X(3)+X(6)-3*X(9)+X(12));
dX(10)=A*(X(11)-g(X(10)))+a(1)*(X(1)+X(4)+X(7)-3*X(10));
dX(11)=X(10)-X(11)+X(12)+a(2)*(X(2)+X(5)+X(8)-3*X(11));
dX(12)=-B*X(11)+a(3)*(X(3)+X(6)+X(9)-3*X(12));


主程序
clear
clc
[t,X] = ode45(@M,[0,100],[0;0;0;0;0;0;0;0;0;0;0;0]);
subplot(2,2,1);
plot(t,X(:,1));
xlabel('t')
ylabel('x11')
subplot(2,2,2);
plot(X(:,1),X(:,4));
xlabel('x11')
ylabel('x21')
subplot(2,2,3);
plot(X(:,1),X(:,7));
xlabel('x11')
ylabel('x31')
subplot(2,2,4);
plot(X(:,1),X(:,10));
xlabel('x11')
ylabel('x41')

[ 本帖最后由 咕噜噜 于 2007-6-15 19:26 编辑 ]
发表于 2007-6-15 16:24 | 显示全部楼层
你的步长要改一下,[0:0.01:50]

clear
clc
[t,X] = ode45(@M,[0:0.01:50],[0;0;0;0;0;0;0;0;0;0;0;0]);
subplot(2,2,1);
plot(t,X(:,1));
xlabel('t')
ylabel('x11')
subplot(2,2,2);
plot(X(:,1),X(:,4),'k.');
xlabel('x11')
ylabel('x21')
subplot(2,2,3);
plot(X(:,1),X(:,7),'k.');
xlabel('x11')
ylabel('x31')
subplot(2,2,4);
plot(X(:,1),X(:,10),'k.');
xlabel('x11')
ylabel('x41')
1111111.bmp
发表于 2007-6-15 18:50 | 显示全部楼层
无水,为什么一定要改步长?
这是我的结果
rr.jpg
发表于 2007-6-15 19:06 | 显示全部楼层

回复 #6 咕噜噜 的帖子

哈哈
很抱歉各位,我看错了以为那中间是冒号,所以我有错了。
 楼主| 发表于 2007-6-16 11:32 | 显示全部楼层
其实这个调用只有用到g(x)里的第一个式子,没有把分段函数体现出来
发表于 2007-6-16 13:14 | 显示全部楼层
那都没有关系,不管多复杂,可以把其写出来,然后保存为m函数,计算的时候是会自动调用的
 楼主| 发表于 2007-6-16 17:13 | 显示全部楼层
可是这个图画出来信号都已经10的7次方了,发散了,正确的只有+-10,老师还是说我函数调用的不对
{8B2751A8-26EF-4A53-8F71-B142352E3839}.JPG

[ 本帖最后由 xicheng_wu 于 2007-6-16 17:14 编辑 ]
 楼主| 发表于 2007-6-16 17:27 | 显示全部楼层
我就要把图1仿真出来
{9756C4B4-C39E-484B-8772-7FED7DBA514F}.JPG {D576AE5E-FD97-4450-9DBD-BB8A686BA2EE}.JPG {4A9FDD77-35F7-4C96-898A-C50EE2803EC3}.JPG {04EAF2AB-5283-4FE2-888B-6423CF7A2964}.JPG
发表于 2007-6-16 21:21 | 显示全部楼层
function y=g(X)
if X>6.4
    y=0.1*pi/3.2*(X-6.4);
elseif X<6.4
    y=0.1*pi/3.2*(X+6.4);
else
    y=-0.1*sin(pi*X/3.2+pi);
end

确实你这个函数错了
你看一下,第一种情况根本就没有意义了
第一个是大于6.4 第二个就是小于6.4,那么只有一种情况就是等于6.4的时候满足三式。
所以你检查一下这个划分是否正确
发表于 2007-6-17 06:52 | 显示全部楼层
  1. function y=g(X)
  2. if X>=6.4
  3.     y=0.1*pi/3.2*(X-6.4);
  4. elseif X<=-6.4
  5.     y=0.1*pi/3.2*(X+6.4);
  6. else
  7.     y=-0.1*sin(pi*X/3.2+pi);
  8. end
复制代码
发表于 2007-6-17 09:11 | 显示全部楼层
哈,没有看到他的划分
发表于 2007-6-19 02:25 | 显示全部楼层
原帖由 无水1324 于 2007-6-17 09:11 发表
哈,没有看到他的划分


方程15
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-11-18 08:04 , Processed in 0.100361 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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