Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 定值fmincon中的Matlab函数_Function_Matlab - Fatal编程技术网

Function 定值fmincon中的Matlab函数

Function 定值fmincon中的Matlab函数,function,matlab,Function,Matlab,我有一个简单的模型,我想最小化因变量y和模型值之间的RMSE。模型为:y=alpha+beta'*x 为了最小化,我正在使用Matlab的fmincon函数,并努力将参数p(2)乘以x MWE: 如果我指定我的函数如下,那么它就工作了 y_mod = @(p) p(1) + p(2).*x 但是,如果我使用以下代码,它将不起作用。如何将p(2)与x相乘?其中x未优化,因为值是给定的 function f = y_mod(p) f = p(1) + p(2).*x end 卡尔, 第二种方

我有一个简单的模型,我想最小化因变量y和模型值之间的RMSE。模型为:
y=alpha+beta'*x

为了最小化,我正在使用Matlab的
fmincon
函数,并努力将参数p(2)乘以x

MWE:

如果我指定我的函数如下,那么它就工作了

y_mod = @(p) p(1) + p(2).*x
但是,如果我使用以下代码,它将不起作用。如何将p(2)与x相乘?其中x未优化,因为值是给定的

function f = y_mod(p)

f = p(1) + p(2).*x

end
卡尔, 第二种方法,即显式声明
y_mod()
(在脚本末尾,或在单独的文件y_mod.m中),不起作用,因为
y_mod()
不知道
x
是什么。通过在顶部的主程序中声明
x
global,并在
y\u mod()中声明
x
global来修复它

当然,您根本不需要
y\u mod()
。如果您使用以下选项,代码也可以工作,在这种情况下,不需要
global x

% objective function
objective = @(p) sqrt(mean((y-p(1)-p(2)*x).^2));

顺便说一句,您不需要在y_mod中与
*
相乘。您可以使用
*
,因为您将标量乘以向量。

以下是具有函数声明的脚本的输出:

>> modelFitExample2a
RMS Error=0.374, intercept=4.208, slope=0.0388
这是上面的代码。它有许多注释行,因为它包括适合数据的替代方法:内联声明
y_mod()
,或多行声明
y_mod()
,或根本没有
y_mod()
。此版本使用多行声明
y\u mod()


我认为将
x
作为输入传递到函数
ymod()
可能会解决此错误<代码>函数f=ymod(p,x)
。是否可以使用此函数声明运行代码?当我用这个函数运行脚本时,会出现以下错误:“错误使用-矩阵维度必须一致”。Carl,是的,我可以用函数dclaration运行代码,我已经这样做了。我将把代码粘贴到这个框中,注释框也不支持格式化,因为代码似乎我不能在注释中有单独的行,所以我将发布运行的代码(包括函数声明)作为对您问题的单独回答。谢谢,问题是我还需要在函数之外定义全局。
% objective function
objective = @(p) sqrt(mean((y-p(1)-p(2)*x).^2));
>> modelFitExample2a
RMS Error=0.374, intercept=4.208, slope=0.0388
%modelFitExample2a.m    WCR 2021-01-19
%Reply to stack exchange question on parameter fitting
clear;
global x    %need this if define y_mod() separately, and in that case y_mod() must declare x global

% data
y = [5.0720, 7.1588, 7.2630, 4.2550, 6.2820, 6.9118, 4.0440, 7.2595, 6.8980, 4.8744...
     6.5179, 7.3434, 5.4316, 3.3800, 5.4640, 5.9000, 6.8000, 6.1930, 6.0700, 5.7370];
x = [18.3447,79.8654,85.0979,10.5211,44.4556,69.5670, 8.9600,86.1970,66.8570,16.8750,...
     52.2697,93.9710,24.3500, 5.1180,25.1260,34.0370,61.4445,42.7040,39.5310,29.9880];

% initial values
p_initial = [0, 0];

%predictive model with parameter p
%y_mod = @(p) p(1) + p(2)*x;

% objective function
%If you use y_mod(), then you must define it somewhere
objective = @(p) sqrt(mean((y - y_mod(p)).^2)); 
%objective = @(p) sqrt(mean((y-p(1)-p(2)*x).^2));

% optimization
options = optimset('Display','Notify');
[param_opt, fval] = fmincon(objective,p_initial,[],[],[],[],[],[],[],options);

% display results
fprintf('RMS Error=%.3f, intercept=%.3f, slope=%.4f\n',...
    fval,param_opt(1),param_opt(2));

%function declaration: predictive model 
%This is an alternative to the inline definition of y_mod() above.
function f = y_mod(p)

global x
f = p(1) + p(2)*x;

end