Lyapunov函数的构造

Lyapunov函数的构造,第1张

有两种理解.(1)库函数是C语言的内部函数或自带函数,外部函数即程序员自定函数.

(2)凡加写了extern 的函数是外部函数.

第一种理解好懂:

C语言的内部函数指的是C语言自带的函数,无论是动态链接的或静态链接的. 这些函数通过C语言的头文件定义了.

例如, sin(),cos()等数学函数,在math.h中定义了,输入输出函数 printf(),fgetc()在stdio.h中定义了,时间函数表time(),ctime()等在time.h中定义了.还有许多其他内部函数.编程时,只要用#include <库名.h>写在编程头部,程序中就可调用.

自定义函数,就是用户自己写的函数.

第二种凡加写了extern 的函数是外部函数:

自定义函数可以与程序的main()写在同一个文件中,也可以写在另一个文件中,这时你可能还另写自己的头文件或者写extern....,告诉编译器,main中用到的某某函数是"外部函数".

例如,main()在a.c中,自定义函数my_func()在a2.c中

a.c内容:

#include <stdio.h>

extern float my_func(float a)

main()

{

printf("result=%f\n",my_func(2.0))

}

a2.c 内容:

float my_func(float a)

{

return a

}

编译:

cl -c a.c [得到a.obj]

cl -c a2.c [得到a2.obj]

cl a.obj a2.obj [链接成a.exe]

运行:

a.exe

result=2.000000

extern float my_func() 是外部说明,告诉编译,main()里的my_func是外部函数,要通过链接(.obj)得到.

如果把my_func写在a.c里:

#include <stdio.h>

float my_func(float a){

retun a

}

main()

{

printf("result=%f\n",my_func(2.0))

}

my_func() 就不是外部函数.

编译:

cl a.c [得a.exe]

运行:

a.exe

result=2.000000

一、连续Lyapunov方程

连续Lyapunov方程可以表示为

Lyapunov方程来源与微分方程稳定性理论,其中要求C为对称正定的n×n方阵,从而可以证明解X亦为n×n对称矩阵,这类方程直接求解比较困难,不过有了Matlab中lyap()函数,就简单多了。

>>A=[1 2 34 5 67 8 0]

A =

1 2 3

4 5 6

7 8 0

>>C=-[10 5 45 6 74 7 9]

C =

-10-5-4

-5-6-7

-4-7-9

>>X=lyap(A,C)

X =

-3.94443.88890.3889

3.8889 -2.77780.2222

0.38890.2222 -0.1111

二、Lyapunov方程的解析解

利用Kroncecker乘积的表示方法,可以将Lyapunov方程写为

function x=lyap2(A,C)

%Lyapunov方程的符号解法

n=size(C,1)

A0=kron(A,eye(n))+kron(eye(n),A)

c=C(:)

x0=-inv(A0)*c

x=reshape(x0,n,n)

例子

>>A=[1 2 34 5 67 8 0]

>>C=-[10 5 45 6 74 7 9]

>>x=lyap2(sym(A),sym(C))

x =

[ -71/18, 35/9, 7/18]

[ 35/9, -25/9,2/9]

[ 7/18,2/9, -1/9]

三、离散Lyapunov方程

离散Lyapunov方程的一般形式为

Matlab中直接提供了dlyap()函数求解该方程:X=dlyap(A,Q)

其实,如果A矩阵非奇异,则等式两边同时右乘得到

就可以将其变换成连续的Sylvester方程

而Sylvester方程是广义Lyapunov方程,故离散的Lyapunov方程还可以使用下面的方法求解

B=-inv(A’)

C=Q*inv(A’)

X=lyap(A,B,C)

下面总结下我们上面的讲到的知识点:

X=lyap(A,C) 连续Lyapunov方程数值解法

X=lyap2(A,C) 连续Lyapunov方程符号解法

X=lyap(A,B,C)广义Lyapunov方程,即Sylvester方程

X=dlyap(A,Q)或者X=lyap(A,-inv(A’),Q*inv(A’))离散Lyapunov方程

Sylvester方程Matlab求解Sylvester方程的一般形式为

该方程又称为广义的Lyapunov方程,式中A是n×n方阵,B是m×m方阵,X和C是n×m矩阵。Matlab控制工具箱提供了直接的求解该方程的lyap()函数

A=[8 1 63 5 74 9 2]

B=[2 34 5]

C=[1 23 45 6]

X=lyap(A,B,C)

A =

8 1 6

3 5 7

4 9 2

B =

2 3

4 5

C =

1 2

3 4

5 6

X =

0.20110.2016

0.03930.1554

-0.6428 -0.8966

同理,我们使用Kronecker乘机的形式将原方程进行如下变化

故可以编写Sylvester方程的解析解函数

function X=lyap3(A,B,C)

%Sylvester方程的解析解法

%rewrited by dynamic

%more information http://www.ilovematlab.cn

If nargin==2,C=BB=A'end

[nr,nc]=size(C)

A0=kron(A,eye(nc))+kron(eye(nr),B')

try

C1=C'

X0=-inv(A0)*C1(:)

X=reshape(X0,nc,nr)

catch

error('Matlabsky提醒您:矩阵奇异!')

end

用上面的数据,我们试验下该解析解法的

>>X=lyap3(sym(A),B,C)

X =

[ 2853/14186,557/14186, -9119/14186]

[ 11441/56744, 8817/56744, -50879/56744]

Riccati方程的Matlab求解Riccati方程是一类很著名的二次型矩阵形式,其一般形式为

由于含有矩阵X的二次项,所有Riccati方程求解要Lyapunov方程更难,Matlab控制工具箱提供了are()函数,可以直接求解该函数

A=[-2 1 -3-1 0 -20 -1 -2]

B=[2 2 -2-1 5 -2-1 1 2]

C=[5 -4 41 0 41 -1 5]

X=are(A,B,C)

A =

-2 1-3

-1 0-2

0-1-2

B =

2 2-2

-1 5-2

-1 1 2

C =

5-4 4

1 0 4

1-1 5

X =

0.9874 -0.79830.4189

0.5774 -0.13080.5775

-0.2840 -0.07300.6924

如何用matlab求解lyapunov指数我是需要分析计算LOGISTIC数据 ,都是用来说明对初值的敏感.以下是LOGISTIC求解的程序 ,希望得到LYAPUNOV的程序.

clc

clear

close all

lambda = 3:5e-4:4

x = 0.4*ones(1,length(lambda))

N1 = 400 % 前面的迭代点数

N2 = 100 % 后面的迭代点数

f = zeros(N1+N2,length(lambda))

for i = 1:N1+N2

x = lambda .* x .* (1 - x)

f(i,:) = x

end

f = f(N1+1:end,:)

plot(lambda,f,'k.','MarkerSize',1)

xlabel('\lambda')

ylabel('x')

慢慢看吧,很有用

哥们,李雅普诺夫指数的算法有很多种,不知你是需要哪种算法的呢?

比如Nicolis方法、Benettin方法、Wolf方法、Jacobia方法等等

我把我以前计算伊侬映射李指数的程序给你,你参考一下:

%---------伊侬吸引子最大Laypunov指数的计算----------%

clear allclc

a=0.9:0.001:1.4k=length(a)

b=0.3p=600

for n=1:k

      for m=2:p

            x(1,n)=0.4y(1,n)=0.6

            x(m,n)=1+b*y(m-1,n)-a(n)*x(m-1,n)^2

            y(m,n)=x(m-1,n)

      end

end

for r=1:k    %计算雅克比矩阵

      for h=2:p

            A{1,r}=[-2*a(r)*x(1,r),b1,0]

            A{h,r}=[-2*a(r)*x(h,r),b1,0]*A{h-1,r}   %注意元胞数组相乘顺序

      end

end

for t=1:k    %计算最大李指数

    vv(:,t)=eig(A{p,t})v=max(abs(vv))

    LE1=1/p*log(v)

end

plot(a,LE1,'k')hold on

plot(a,0,'k:')

axis([a(1),a(k),-1 1])

xlabel('a')ylabel('LE1')title('最大李指数')


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11969906.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存