打印

看了一堆MATLAB书,还是不会建模

[复制链接]
20068|95
手机看帖
扫描二维码
随时随地手机跟帖
来自 2楼
highgear| | 2010-11-16 22:20 | 只看该作者
我简单的讲一讲系统识别.

最小二乘法常常被用作多项式逆合,这里被用做拟和系统的输入输出。一个加热系统, 理论上与一个一阶的RC系统非常相似,只是电阻,电容换成了热阻,热容。加热系统的输入是热量, 可以通过控制可控硅的导通角,或者是简单的控制通断时间(周期必须远小于系统的热时间常数)来调节;加热系统的输出是温度。


下面的图形是理论上加热系统的输入输出关系。系统输入为一个方波,即加热一段时间后,自然散热一段时间。






下面的图形假定为实际测量的输出,是用上图的输出加上噪声所形成:







用最小而乘法对实际测量的输入输出作系统识别, 可以得到系统的传递函数。识别中阶数越高, 拟合的越好,甚至可以把一个小小的毛刺拟合出来。下图,是用识别出的传递函数的输出与实际的输出比较的图形。






使用特权

评论回复
板凳
原野之狼| | 2010-11-16 01:26 | 只看该作者
匠人 你都能把股票跟PID扯一块去 还愁搞不定建模呢

使用特权

评论回复
地板
highgear| | 2010-11-16 01:46 | 只看该作者
哈哈,我正考虑是否要把如何建模部分加入到我的讲义里, 看来是不用了。

其实, 大多数人只要知道如何能得到一个系统的传递函数, 可以进行仿真运算就够了, 没有必要了解具体的细节。
如果知道系统的特性, 比如系统的微分方程之类, 可以用状态空间法建立模型;
或者通过测量输入(一般使用一个方波)和输出, 用最小二乘法得到系统的零极点, 然后用手工剔除特大极点(极点越大, 对系统影响越小)和极其接近的零极点(可以认为是噪声引起或者是轻微的系统扰动), 来识别系统。随后通过识别出的传递函数生成一个 simulink 的子系统用于仿真。

使用特权

评论回复
5
highgear| | 2010-11-16 01:59 | 只看该作者
说到股票, 我做过很多种数学工具来分析股票, 什么Fir, iir 滤波器, 系统识别等等。最后的结论是:

数学工具对股市预测的准确度为50%, 我相信动物园里的一只神清气爽的大猩猩可能会有更高的预测准确度。我发现, 技术分析最有用的工具居然就是最简单的直线-----趋势线, 可以与大猩猩比肩。

使用特权

评论回复
6
程序匠人|  楼主 | 2010-11-16 09:57 | 只看该作者
哈哈,我正考虑是否要把如何建模部分加入到我的讲义里, 看来是不用了。

其实, 大多数人只要知道如何能得到一个系统的传递函数, 可以进行仿真运算就够了, 没有必要了解具体的细节。
如果知道系统的特性, 比如系 ...
highgear 发表于 2010-11-16 01:46


实际上,我也只是希望知道如何得到系统的传递函数,比如一个加热系统。
highgear的讲义在哪里有下载吗?还是藏在自己的硬盘上等我上门来盗取?
highgear给我们上上课吧?

使用特权

评论回复
7
程序匠人|  楼主 | 2010-11-16 09:59 | 只看该作者
说到股票, 我做过很多种数学工具来分析股票, 什么Fir, iir 滤波器, 系统识别等等。最后的结论是:

数学工具对股市预测的准确度为50%, 我相信动物园里的一只神清气爽的大猩猩可能会有更高的预测准确度。我发现, ...
highgear 发表于 2010-11-16 01:59


股票的技术分析一旦被庄家知道,就会有操盘手利用这种技术进行诈骗,诱多或诱空。——这就是失效的原因之一。

使用特权

评论回复
8
hq_y| | 2010-11-16 10:55 | 只看该作者
找个人口授心传
技术这种东西,口授心传是最快的

使用特权

评论回复
9
highgear| | 2010-11-16 22:24 | 只看该作者
Matlab 测试程序如下:



Ts = 0.05;
sysc = tf([0 1], [1 1]);   
sysd = c2d(sysc, Ts);
t = 0.1:Ts:20;
x = square(t);
yd = lsim(sysd, x, t, 0);
ys = yd + 0.1*rand(size(yd));
[numc, denc] = LeastSquare(x, ys, 60);
sysd_hat = tf(numc, denc, Ts);
yhat = lsim(sysd_hat, x, t, 0);
plot(t, ys, t, yhat);





最小二乘法程序, x, y 为输入输出, N为阶数:

function [numc, denc] = LeastSquare(x, y, N)
count = length(y);
M = count - 1;
ai = zeros(N*2, M);
for i=1:N
    ai(i, i:M) = x(1:(count-i));
    ai(i+N, i:M) = -y(1:(count-i));
end
bi = y(2:(count));
xd = (inv(ai*ai')*ai*bi)';
numc = [0 xd(1:N)];
denc = [1 xd(N+1: N+N)];


使用特权

评论回复
10
高工老头| | 2010-11-16 22:43 | 只看该作者
哪有matlab下载?

使用特权

评论回复
11
程序匠人|  楼主 | 2010-11-16 22:45 | 只看该作者
先给H加条裤子,再慢慢研读

使用特权

评论回复
12
程序匠人|  楼主 | 2010-11-16 22:50 | 只看该作者
关于这句:“用最小而乘法对实际测量的输入输出作系统识别, 可以得到系统的传递函数。识别中阶数越高, 拟合的越好,甚至可以把一个小小的毛刺拟合出来。”

想知道的正是如何拟合出这个传递函数。
比如说我可以人为地给该加热系统一个类似图1的系统输入方波,并测量出输出(温度曲线),那么如何根据这条曲线倒推成一个函数?

使用特权

评论回复
13
程序匠人|  楼主 | 2010-11-16 22:59 | 只看该作者
补充一下,我不关心那些毛刺

使用特权

评论回复
14
程序匠人|  楼主 | 2010-11-16 23:07 | 只看该作者
哪有matlab下载?
高工老头 发表于 2010-11-16 22:43


用电驴去驼吧。2010B,最新版的,有4个多G。

使用特权

评论回复
15
highgear| | 2010-11-16 23:10 | 只看该作者
9搂的程序就是“根据这条曲线倒推成一个函数“ 

function [numc, denc] = LeastSquare(x, y, N)

解释:x 为实际测量的输入, y 为实际测量的输出, N 为可能的系统传递函数的阶数。
结果: [numc, denc] 为连续域传递函数的分子和分母的系数序列。

上面的测试使用了 60 阶, 得到的是 60 阶的传递函数, 这么高阶是为了展示拟合效果。实际上, 只需保留系统主要的极点, 构成一个低阶的传递函数。

使用特权

评论回复
16
程序匠人|  楼主 | 2010-11-16 23:21 | 只看该作者
h老师用的是哪个版本的matlab?
我运行你的程序,报错。


Warning: Simulation will start at a nonzero initial time.
> In warning at 26
  In lti.lsim at 91
??? Undefined function or method 'LeastSquare' for input
arguments of type 'double'.





??? function [numc, denc] = LeastSquare(x, y, N)
    |
Error: Function definitions are not permitted in this context.

使用特权

评论回复
17
highgear| | 2010-11-16 23:27 | 只看该作者
这是路径的问题。把 function [numc, denc] = LeastSquare(x, y, N) 另存为一个leastSquare.m 文件, 与测试的 .m 文件放在同一目录, 并在 matlab 的 File->Set Path 中加入当前目录。

使用特权

评论回复
18
程序匠人|  楼主 | 2010-11-16 23:33 | 只看该作者
测试成功:

使用特权

评论回复
19
程序匠人|  楼主 | 2010-11-16 23:34 | 只看该作者
多谢h老师指导,待俺消化消化再讨教

使用特权

评论回复
20
scutzhh| | 2010-11-17 00:01 | 只看该作者
数学这东西很高深的!MATLAB学好了不一定就代表你会建模了,因为IDEAI才是最重要的!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名: 《匠人手记》第二版已经上市,各大网络书店和实体书店有售! 匠人手机——手机中的颤抖机!欧耶! 匠人手记——手记中的战斗记!欧耶!

734

主题

11156

帖子

676

粉丝