急求一个利用最小二乘法将n阶的传递函数降为m阶的matlab代码,重谢啊!!!!!
2个回答
展开全部
lz 你好,提供两种方法,希望对你有帮助:
1、最小二乘法
function a=ZJZXEC(x,y,m)
if(length(x) == length(y))
n = length(x);
else
disp('x和y的维数不相等!');
return;
end %维数检查
syms v;
d = zeros(1,m+1);
q = zeros(1,m+1);
alpha = zeros(1,m+1);
for k=0:m
px(k+1)=power(v,k);
end %x的幂多项式
B2 = [1];
d(1) = n;
for l=1:n
q(1) = q(1) + y(l);
alpha(1) = alpha(1) + x(l);
end
q(1) = q(1)/d(1);
alpha(1) = alpha(1)/d(1);
a(1) = q(1);
B1 = [-alpha(1) 1];
for l=1:n
d(2) = d(2) + (x(l)-alpha(1))^2;
q(2) = q(2) + y(l)*(x(l)-alpha(1));
alpha(2) = alpha(2) + x(l)*(x(l)-alpha(1))^2;
end
q(2) = q(2)/d(2);
alpha(2) = alpha(2)/d(2);
a(1) = a(1)+q(2)*(-alpha(1));
a(2) = q(2);
beta = d(2)/d(1);
for i=3:(m+1)
B = zeros(1,i);
B(i) = B1(i-1);
B(i-1) = -alpha(i-1)*B1(i-1)+B1(i-2);
for j=2:i-2
B(j) = -alpha(i-1)*B1(j)+B1(j-1)-beta*B2(j);
end
B(1) = -alpha(i-1)*B1(1)-beta*B2(1);
BF = B*transpose(px(1:i));
for l=1:n
Qx = subs(BF,'v',x(l));
d(i) = d(i) + (Qx)^2;
q(i) = q(i) + y(l)*Qx;
alpha(i) = alpha(i) + x(l)*(Qx)^2;
end
alpha(i) = alpha(i)/d(i);
q(i) = q(i)/d(i);
beta = d(i)/d(i-1);
for k=1:i-1
a(k) = a(k)+q(i)*B(k);
end
a(i) = q(i)*B(i);
B2 = B1;
B1 = B;
end
2、直接法
function A=multifit(X,Y,m)
%A--输出的拟合多项式的系数
N=length(X);
M=length(Y);
if(N ~= M)
disp('数据点坐标不匹配!');
return;
end
c(1:(2*m+1))=0;
b(1:(m+1))=0;
for j=1:(2*m+1) %求出c和b
for k=1:N
c(j)=c(j)+X(k)^(j-1);
if(j<(m+2))
b(j)=b(j)+Y(k)*X(k)^(j-1);
end
end
end
C(1,:)=c(1:(m+1));
for s=2:(m+1)
C(s,:)=c(s:(m+s));
end
A=b'\C; %直接求解法求出拟合系数
方法来自matlab中文论坛,提供给你参考下
1、最小二乘法
function a=ZJZXEC(x,y,m)
if(length(x) == length(y))
n = length(x);
else
disp('x和y的维数不相等!');
return;
end %维数检查
syms v;
d = zeros(1,m+1);
q = zeros(1,m+1);
alpha = zeros(1,m+1);
for k=0:m
px(k+1)=power(v,k);
end %x的幂多项式
B2 = [1];
d(1) = n;
for l=1:n
q(1) = q(1) + y(l);
alpha(1) = alpha(1) + x(l);
end
q(1) = q(1)/d(1);
alpha(1) = alpha(1)/d(1);
a(1) = q(1);
B1 = [-alpha(1) 1];
for l=1:n
d(2) = d(2) + (x(l)-alpha(1))^2;
q(2) = q(2) + y(l)*(x(l)-alpha(1));
alpha(2) = alpha(2) + x(l)*(x(l)-alpha(1))^2;
end
q(2) = q(2)/d(2);
alpha(2) = alpha(2)/d(2);
a(1) = a(1)+q(2)*(-alpha(1));
a(2) = q(2);
beta = d(2)/d(1);
for i=3:(m+1)
B = zeros(1,i);
B(i) = B1(i-1);
B(i-1) = -alpha(i-1)*B1(i-1)+B1(i-2);
for j=2:i-2
B(j) = -alpha(i-1)*B1(j)+B1(j-1)-beta*B2(j);
end
B(1) = -alpha(i-1)*B1(1)-beta*B2(1);
BF = B*transpose(px(1:i));
for l=1:n
Qx = subs(BF,'v',x(l));
d(i) = d(i) + (Qx)^2;
q(i) = q(i) + y(l)*Qx;
alpha(i) = alpha(i) + x(l)*(Qx)^2;
end
alpha(i) = alpha(i)/d(i);
q(i) = q(i)/d(i);
beta = d(i)/d(i-1);
for k=1:i-1
a(k) = a(k)+q(i)*B(k);
end
a(i) = q(i)*B(i);
B2 = B1;
B1 = B;
end
2、直接法
function A=multifit(X,Y,m)
%A--输出的拟合多项式的系数
N=length(X);
M=length(Y);
if(N ~= M)
disp('数据点坐标不匹配!');
return;
end
c(1:(2*m+1))=0;
b(1:(m+1))=0;
for j=1:(2*m+1) %求出c和b
for k=1:N
c(j)=c(j)+X(k)^(j-1);
if(j<(m+2))
b(j)=b(j)+Y(k)*X(k)^(j-1);
end
end
end
C(1,:)=c(1:(m+1));
for s=2:(m+1)
C(s,:)=c(s:(m+s));
end
A=b'\C; %直接求解法求出拟合系数
方法来自matlab中文论坛,提供给你参考下
Sievers分析仪
2024-10-13 广告
2024-10-13 广告
是的。传统上,对于符合要求的内毒素检测,最终用户必须从标准内毒素库存瓶中构建至少一式两份三点标准曲线;必须有重复的阴性控制;每个样品和PPC必须一式两份。有了Sievers Eclipse内毒素检测仪,这些步骤可以通过使用预嵌入的内毒素标准...
点击进入详情页
本回答由Sievers分析仪提供
展开全部
楼上的回答似乎离题了。楼主问的是传递函数降阶,而楼上给的是多项式拟合算法(也可用于多项式降阶,但这和传函降阶是两码事,而且,即使是多项式拟合,也没必要搞那么复杂)。
MATLAB中似乎没有现成的传递函数降阶函数可用,查了一下文献,使用最小二乘方法估算传递函数的倒是有一些,属于系统辨识的内容。
对于楼主的降阶要求,基本思路应该是先求出原系统的响应,然后再用响应数据去估算低阶传递函数吧。而求系统响应包括时域和频域两大类,估算的模型又包括连续时间和离散时间的(还有,是否考虑包含一个延迟环节),楼主能把有关要求再明确一些吗?
另外,看到较新的MATLAB版本提供了一个tdest函数(就我知道的而言,R2012b里面有,但R2008a没有),也许可供楼主参考。
楼主提供更进一步的信息之后,可为楼主提供后续的支持。希望对楼主有帮助。
MATLAB中似乎没有现成的传递函数降阶函数可用,查了一下文献,使用最小二乘方法估算传递函数的倒是有一些,属于系统辨识的内容。
对于楼主的降阶要求,基本思路应该是先求出原系统的响应,然后再用响应数据去估算低阶传递函数吧。而求系统响应包括时域和频域两大类,估算的模型又包括连续时间和离散时间的(还有,是否考虑包含一个延迟环节),楼主能把有关要求再明确一些吗?
另外,看到较新的MATLAB版本提供了一个tdest函数(就我知道的而言,R2012b里面有,但R2008a没有),也许可供楼主参考。
楼主提供更进一步的信息之后,可为楼主提供后续的支持。希望对楼主有帮助。
追问
是的,我的问题就是有关使用最小二乘方法估算传递函数,属于系统辨识的内容。
能否留个邮,箱,我吧详细内容发给你看看。
追答
可发到企鹅信箱522319871,不要加好友,我平常QQ不在线。
另,看到你又另外开了一个定向求助的提问,没必要吧,就在这里交流好了。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询