士郎小天使 2022-03-11 15:23 采纳率: 81.1%
浏览 77
已结题

按照如图的公式,如何用fmincon把约束加上

我的代码是用极大似然估计来把下图的公式里面x,y,w参数算出来,w是权重,有约束,请问如何把打红框w的约束加进代码

img

如果i等于1的话,是如下代码,没有错误

X = xlsread('1.xlsx'); % X是个列向量
I0 = @(y) 1/(2*pi)*integral(@(x)exp(y.*cos(x)),0,2*pi);
% modelFun中, beta(1)对应y, beta(2)对应z
f = @(beta, x)1/(2*pi*I0(beta(1)))*exp(beta(1)*cos(x-beta(2)));
L = @(beta) -sum(log(f(beta, X))); % L取极小,-sum(log(f(beta, x)))就取极大
x0 = [1,1];
beta = fmincon(L, x0); % 这样beta就出来了
y = beta(1)
z = beta(2)

但当i等于4的时候,需要算w的约束,请问如何把w的约束加上去,下面是我暂时写出的代码,感觉有许多错误和可以改进的地方


X=xlsread('1.xlsx'); %x是一堆角度列向量

I0 = @(y) 1/(2*pi)*integral(@(x)exp(y(1).*cos(x)),0,2*pi);
I1 = @(y) 1/(2*pi)*integral(@(x)exp(y(2).*cos(x)),0,2*pi);
I2 = @(y) 1/(2*pi)*integral(@(x)exp(y(3).*cos(x)),0,2*pi);
I3 = @(y) 1/(2*pi)*integral(@(x)exp(y(4).*cos(x)),0,2*pi);%这一块感觉写的有问题

f = @(beta, x)beta(3)*(1/(2*pi*I0(beta(1)))*exp(beta(1)*cos(x-beta(2))))...
+beta(6)*(1/(2*pi*I1(beta(4)))*exp(beta(4)*cos(x-beta(5))))...
+beta(9)*(1/(2*pi*I2(beta(7)))*exp(beta(7)*cos(x-beta(8))))...
+beta(10)*(1/(2*pi*I3(beta(11)))*exp(beta(11)*cos(x-beta(12))));

L = @(beta) -sum(log(f(beta, X)));
% 如何在这里把w的约束加进去
x0 = [1,1];
beta = fmincon(L, x0);

y(1) = beta(1),y(2) = beta(4),y(3) = beta(7),y(4) = beta(10)
z(1) = beta(2),z(2) = beta(5),z(3) = beta(8),z(4) = beta(11)
w(1) = beta(3),w(2) = beta(6),w(3) = beta(9),w(4) = beta(12)
  • 写回答

3条回答 默认 最新

  • joel_1993 2022-03-11 22:32
    关注

    可以这么写,你看看

    clc; clear
    % X = rand(100,1); % 我是用随机数做测试的
    X = xlsread('1.xlsx'); % X是个列向量
    f = @(beta, x)fun(x, beta);
    L = @(beta) -sum(log(f(beta, X))); % L取极小,-sum(log(f(beta, x)))就取极大
    n = 5; % 比方说有y、z、w各n个
    beta0 = rand(n,3);
    % Aeq 和beq保证wi相加为1
    Aeq = [zeros(1, 2*n), ones(1, n)];
    beq = 1;
    % lb ub保证wi在0~1之间
    lb = [-inf*ones(2*n,1); zeros(n,1)];
    ub = [ inf*ones(2*n,1);  ones(n,1)];
    beta = fmincon(L, beta0(:),[],[],Aeq,beq,lb,ub); % 这样beta就出来了
    beta = reshape(beta, n, 3);
    y = beta(:,1)
    z = beta(:,2)
    w = beta(:,3)
    
    function f = fun(x, yzw)
    n = numel(yzw);
    m = n/3;
    y = yzw(1:m);
    z = yzw(m+1:2*m);
    w = yzw(2*m+1:3*m);
    I0 = @(y) 1/(2*pi)*integral(@(x)exp(y.*cos(x)),0,2*pi);
    f = zeros(size(x));
    for i = 1:m
        f = f + w(i)*1/(2*pi*I0(y(i)))*exp(y(i)*cos(x-z(i)));
    end
    end
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月20日
  • 已采纳回答 3月12日
  • 赞助了问题酬金10元 3月11日
  • 修改了问题 3月11日
  • 展开全部

悬赏问题

  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥15 树莓派5怎么用camera module 3啊
  • ¥20 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
  • ¥15 Attention is all you need 的代码运行