xicheng_wu 发表于 2007-6-15 12:47

请教:函数和子函数

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
我怎么样可以把他用到上面那段程序里去啊

无水1324 发表于 2007-6-15 13:01

你分别保存这两个函数就可以直接调用的

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

xicheng_wu 发表于 2007-6-15 15:56

原帖由 无水1324 于 2007-6-15 13:01 发表 http://www.chinavib.com/forum/images/common/back.gif
你分别保存这两个函数就可以直接跳用的
还是不对诶,能不能说具体点啊,我单独把g(x)做了个m文件但结果是一样的
clear
clc
= ode45(@M,,);
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
= ode45(@M,,);
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 编辑 ]

无水1324 发表于 2007-6-15 16:24

你的步长要改一下,

clear
clc
= ode45(@M,,);
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')

咕噜噜 发表于 2007-6-15 18:50

无水,为什么一定要改步长?
这是我的结果

无水1324 发表于 2007-6-15 19:06

回复 #6 咕噜噜 的帖子

哈哈
很抱歉各位,我看错了以为那中间是冒号,所以我有错了。

xicheng_wu 发表于 2007-6-16 11:32

其实这个调用只有用到g(x)里的第一个式子,没有把分段函数体现出来

无水1324 发表于 2007-6-16 13:14

那都没有关系,不管多复杂,可以把其写出来,然后保存为m函数,计算的时候是会自动调用的

xicheng_wu 发表于 2007-6-16 17:13

可是这个图画出来信号都已经10的7次方了,发散了,正确的只有+-10,老师还是说我函数调用的不对


[ 本帖最后由 xicheng_wu 于 2007-6-16 17:14 编辑 ]

xicheng_wu 发表于 2007-6-16 17:27

我就要把图1仿真出来

无水1324 发表于 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的时候满足三式。
所以你检查一下这个划分是否正确

gghhjj 发表于 2007-6-17 06:52

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

无水1324 发表于 2007-6-17 09:11

哈,没有看到他的划分

gghhjj 发表于 2007-6-19 02:25

原帖由 无水1324 于 2007-6-17 09:11 发表 http://www.chinavib.com/forum/images/common/back.gif
哈,没有看到他的划分

方程15
页: [1] 2
查看完整版本: 请教:函数和子函数