声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 964|回复: 1

[编程技巧] 如何处理用非线性最小二乘法估计含卷积的函数式子参数

[复制链接]
发表于 2007-11-26 22:04 | 显示全部楼层 |阅读模式

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

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

x
我的问题是对函数式y(x)=(a1*exp(a2*x)-a3*exp(a4*x))⊙fun(x),⊙表示卷积,fun(x)表示一个简单的关于x的函数。我的问题是已知x=[0 15 30 45 60 75 90 105 120 150 180 240 300 450 600 900 1200 1800 2700 3600],已知函数y和函数fun 在x点的值,我的问题是利用非线性最小二乘法估计参数a1,a2,a3,a4
我编写的程序如下:
%利用NLS计算FDG参数
function E=twoexps04(a,x,y)% remember we must have function return value
%twoexp04.m 计算二乘残差的程序
x=x(:);y=y(:);
y_in=[0 0.167 0.119 0.102 0.099 0.094 0.097 0.092 0.089 0.078 0.072 0.072 0.058 0.053 0.019 0.043 0.037 0.029 0.031 0.034];

%输入函数仿真
y_nls=a(1)*exp(-a(3)*x)-a(2)*exp(-a(4)*x);
Y=conv(y_in,y_nls);%计算估计函数值做卷积
Y=Y(1:20);%Convolution demention is length(A)+LENGTH(B)-1,直接取前20个点计算残差,好像不科学
E=sum((y-Y).^2);%二乘残差

%利用fminsearch进行非线性参数估计,非线性最小二乘法计算fdg参数
%结果非常不好,编程出错,搞不定卷积不考虑卷积的问题,直接与twoexp04.m配对
%直接做卷积没考虑长度问题
%使用办法将本文件y_in和y分别改为输入函数和输出函数,同时将twoexps04中的_y_in公式改掉,然后点击/debug/run即可;
clc;
clear;
x=[0 15 30 45 60 75 90 105 120 150 180 240 300 450 600 900 1200 1800 2700 3600];%是否取0结果很大不同.为采样时间点
y_in=[0 0.167 0.119 0.102 0.099 0.094 0.097 0.092 0.089 0.078 0.072 0.072 0.058 0.053 0.019 0.043 0.037 0.029 0.031 0.034];%s30的动脉采血值输入函数
y=[0 0.072 0.044 0.047 0.053 0.057 0.05 0.045 0.052 0.049 0.054 0.05 0.048 0.049 0.054 0.061 0.064 0.077 0.095 0.104];
STDY=1;%假定之
a0=[1.1931 1.0880 0.0419 1.3809];
options=optimset('fminsearch');
options.TolX=0.01;%控制被估计参数的精度
options.Display='off';
a=fminsearch(@twoexps04,a0,options,x,y);%计算二乘残差最小时的系数值

disp('估计的参数是');
disp(a);

现在的问题是 1 我不知道我对卷积的处理是不是正确的,我计算二值残差直接取了前20个点做残差,由于卷积后序列的长度变长
2 NLS的初值敏感怎么处理
回复
分享到:

使用道具 举报

 楼主| 发表于 2007-11-28 00:04 | 显示全部楼层

如何处理用非线性最小二乘法估计含卷积的函数式子参数

利用变换处理将卷积为乘积,怎么样?
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-9-22 10:24 , Processed in 0.057308 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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