【问题标题】:minimization in matlabmatlab中的最小化
【发布时间】:2012-02-16 13:21:40
【问题描述】:

我正在使用 matlab 来最小化平方和(卡方)函数。我的模型有一个定积分(从零到数据值)。模型有三个参数 w.r.t 我需要最小化。

我需要将(1+x).^(b-a-2).* exp(-b.*x)从零积分到z(i),其中ab是参数。

我做一个函数句柄

modelfun1=@ (y,a,b,c) (978.4./c).int( (1+x).^(ba-2). exp(-b.* x),0,y)

然后平方和函数为

sum1=@(a,b,c,data) sum(((data.ydata-modelfun1(data.xdata,a,b,c)).^2)./data.zdata.^2);

其中data.xdata 包含所有z 值,data.ydata 是观察值,data.zdata 是方差。

当我使用fminsearch 最小化这个函数时

[tmin,ssmin]=fminsearch(sum1,[-0.1;0.06;70],[],data)

我收到以下错误

使用错误

@(a,b,c,data)sum(((data.ydata-modelfun1(data.xdata,a,b,c)).^2)./data.zdata.^2)

输入参数不足。

fminsearch 中的错误(第 191 行)

fv(:,1) = funfcn(x,varargin{:});

谁能指出我做错了什么。我尝试了更多的东西,但这似乎是最经常出现的错误。

这是解决问题的另一种尝试

我正在尝试使用 nlinfit 最小化卡方函数(涉及模型中的定积分)。这是我的尝试: 我使模型功能如下:

function [ f ] = modelf( p,ul )
syms x
a=p(1);
b=p(2);
c=p(3);
f=(978.4./c).*int((1+x)^(b-a-2)*exp(-b*x),x,0,ul);
end 

这里的'ul'是积分的上限。它是从数据矩阵z (32X1) 中代入的。相关数据在矩阵 y(32X1) 中。我制作了另一个具有加权 y 值的数据集

w = 1/variance;

其中方差是数据点上的单个误差 yw = sqrt(w).*y;

我还将加权函数句柄设为

modelfunw=@(p,z) (sqrt(var))'.*modelf(p,z);

然后我将 nlinfit 称为

p0=[-0.1 0.05 70]'; %the initial guess

beta=nlinfit(z,yw,modelfunw,p0)

但我收到以下错误消息

使用 nlinfit 时出错(第 120 行) 评估模型函数 '@(p,z)(sqrt(var))'.*modelf(p,z)' 时出错。

原因: 使用 mupadmex 时出错 MuPAD 命令错误:非法参数 [checkNumber]

有人可以指出我做错了什么吗?或者有没有更好的方法来最小化卡方?

【问题讨论】:

    标签: matlab


    【解决方案1】:

    您必须将所有参数打包到一个状态向量中。而不是单独的参数abc,而是使用p(1)p(2)p(3)

    【讨论】:

    • 我也试过了,我得到以下错误错误使用 mupadmex 错误 MuPAD 命令中的错误:非法参数 [checkNumber] sym/int 错误(第 131 行) r = mupadmex('symobj::intdef' ,fs,xs,as,bs,选项); @(y,theta)(978.4./c).*int((1+x).^(theta(2)-theta(1)-2).*exp(-theta(2).*x 中的错误),0,y) @(theta,data)sum(((data.ydata-modelfun1(data.xdata,theta)).^2)./data.zdata.^2) 中的错误 fminsearch 中的错误(第 191 行) fv(:,1) = funfcn(x,varargin{:});
    • 正如@BenVoigt 所说,您必须执行sum1=@(p,data) ...modelfun1(data.xdata,p(1),p(2),p(3)))...; 之类的操作。如果这不起作用,请在您的问题中发布该尝试以及您得到的错误。您的modelfun1 可以保持原样。
    • modelfun1=@ (y,p) (978.4./p(3)).*int( (1+x).^(p(2)-p(1)-2)。 * exp(-p(2).*x),0,y); >> sum1=@(p,data) sum(((data.ydata-modelfun1(data.xdata,p)).^2)./data.zdata.^2); >> [tmin,ssmin]=fminsearch(sum1,[-0.1;0.06;70],[],数据)
    • 错误:使用 mupadmex 时出错 MuPAD 命令中的错误:非法参数 [checkNumber] sym/int 中的错误(第 131 行)r = mupadmex('symobj::intdef',fs,xs,as,bs ,选项); @(y,p)(978.4./p(3)).*int((1+x).^(p(2)-p(1)-2).*exp(-p(2) 中的错误.*x),0,y) @(p,data)sum(((data.ydata-modelfun1(data.xdata,p)).^2)./data.zdata.^2) 中的错误 fminsearch 中的错误(第 191 行)fv(:,1) = funfcn(x,varargin{:})... 我不明白我做错了什么
    • @aymer:尝试使用命名函数而不是匿名函数句柄。使用临时变量在多个步骤中执行每个计算,以帮助找出失败的确切原因。使用 MatLab 调试器找出故障发生时参数的值是什么
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多