【问题标题】:Use of excel solver function in matlab for multiple optimizationmatlab中使用excel求解函数进行多重优化
【发布时间】:2015-01-26 02:27:32
【问题描述】:

我有多组xy。其中之一如下:

x = [  1.4   15.15    49.395    98.8  151.475    184.41    230.51    259.2 ]
y = [ 12.15  21.2125  25.15125  25.3   24.63125   28.8975   29.8725   35.2 ]

除此之外,我还有两个参数knx相关如下

q = k.* x^-n

我有三个功能:

e = q.*q - y.*y

f = q-y

g = (q-y)^1/2

首先我想最小化与y相关的函数e如下:

e = q.*q - y.*y

之后我想同时最小化函数f,然后是g

【问题讨论】:

标签: matlab math modeling


【解决方案1】:

您的代码中有几个缺陷。

  1. 您的“函数”不是函数,而是向量。 --> 函数句柄
  2. 您的最小化“函数” f 没有意义,因为正负误差可以相互抵消 --> 绝对值
  3. 您的最小化“函数”g 可以产生虚数,因为 q-y 可以得到负数 --> 绝对值

这里有一些代码,从技术上讲,你想要什么。我还添加了函数h,它最小化平方误差之和,这是默认的最小化函数

%// Data
x = [  1.4   15.15    49.395    98.8  151.475    184.41    230.51    259.2 ];
y = [ 12.15  21.2125  25.15125  25.3   24.63125   28.8975   29.8725   35.2 ];

%// create model function q with parameters p(1) = k and p(2) = n
q = @(p, x) p(1)*x.^(-p(2));

%// create the desired error-functions for minimization
e = @(p) sum((y.^2 - q(p, x)).^2); %// minimization function
f = @(p) sum(abs(y - q(p, x))); %// better sum over absolute values
g = @(p) sum(sqrt(abs(q(p, x) - y))); %// better take square roots of absolute values
h = @(p) sum((q(p, x) - y).^2); %// default minimizaton function

p0 = [1, -0.5]; % an initial guess 

[p_fit_e, r_e] = fminsearch(e, p0) % Optimize 
[p_fit_f, r_f] = fminsearch(f, p0) % Optimize 
[p_fit_g, r_g] = fminsearch(g, p0) % Optimize 
[p_fit_h, r_h] = fminsearch(h, p0) % Optimize 

%// visualization
figure
plot(x,y,'ko')
hold on
X = linspace(min(x), max(x), 100);

plot(X, q(p_fit_e, X), 'r-')
plot(X, q(p_fit_f, X), 'g-')
plot(X, q(p_fit_g, X), 'b-')
plot(X, q(p_fit_h, X), 'k-')

错误函数e 的优化似乎失败了。 请注意,对于函数h 的默认情况,您也可以像这样使用nlinfit

p_fit_h_nlinfit = nlinfit(x, y, q, p0);

在这种情况下产生相同的结果:

p_fit_h_nlinfit =

12.3018   -0.1675

p_fit_h =

12.3018   -0.1675

【讨论】:

  • 感谢 Nras 为我解决了这个问题
  • 如果我想将我的常数 n 从零绑定到一(0 到 1)。如何修改源代码
  • @DEEPAKGUSAIN 对于条件优化,请查看fmincon(需要优化工具箱)。
  • 感谢@Nras 的帮助和洞察力
【解决方案2】:
@Nras I have modified the syntax and thanks for your help

%// 数据 x = [ 1.4 15.15 49.395 98.8 151.475 184.41 230.51 259.2 ]; y = [ 12.15 21.2125 25.15125 25.3 24.63125 28.8975 29.8725 35.2 ];

%// 创建模型函数 q,参数为 p(1) = k 和 p(2) = n q = @(p, x) p(1)*x.^(-p(2));

%// 为最小化创建所需的误差函数 e = @(p) sum((y.^2 - q(p, x)).^2); %// 最小化函数 f = @(p) sum(abs(y - q(p, x))); %// 比绝对值更好的总和 g = @(p) sum(sqrt(abs(q(p, x) - y))); %// 最好取绝对值的平方根 h = @(p) sum((q(p, x) - y).^2); %// 默认最小化函数

p0 = [1, 0.5]; % an initial guess 

A = [];
b=[];
Aeq = [];
beq=[];
lb = [-inf,0];
ub = [inf,1];
nonlcon= []
options = optimset('Display','iter','Algorithm','active-set');
options.MaxFunEvals = 100000;
options.MaxIter = 100000

[p_fit_e, r_e] = fmincon(e,p0,A,b,Aeq,beq,lb,ub,nonlcon,options) % Optimize 
[p_fit_f, r_f] = fmincon(f, p0,A,b,Aeq,beq,lb,ub,nonlcon,options) % Optimize 
[p_fit_g, r_g] = fmincon(g, p0,A,b,Aeq,beq,lb,ub,nonlcon,options) % Optimize 
[p_fit_h, r_h] = fmincon(h,p0,A,b,Aeq,beq,lb,ub,nonlcon,options)% Optimize

[minVal minInd] = min(r_e)
[minVal minInd] = min(r_f)
[minVal minInd] = min(r_g)
[minVal minInd] = min(r_h)

e1 =  p_fit_e(1)*x.^(-p_fit_e(2));
f1 =  p_fit_f(1)*x.^(-p_fit_f(2));
g1 =  p_fit_g(1)*x.^(-p_fit_g(2));
h1 =  p_fit_h(1)*x.^(-p_fit_h(2));


figure(1)
plot(x,e1)
hold on
plot(x,y)

figure(2)
plot(x,f1)
hold on
plot(x,y)

figure(3)
plot(x,g1)
hold on
plot(x,y)

figure(4)
plot(x,h1)
hold on
plot(x,y)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 2018-08-05
    • 2018-11-07
    • 1970-01-01
    • 2016-02-21
    • 2022-12-14
    相关资源
    最近更新 更多