Оптимизация Lsqnonlin на комплексной функции с Matlab? - PullRequest
0 голосов
/ 30 апреля 2020

После решения линейной системы уравнений для нахождения коэффициента пропускания для диэлектрической c структуры я получаю следующую функцию -

T_coeff_opt = @(x) (256*(cos(2*(pi)*(2*x(1) + x(2))) - sin(2*(pi)*(2*x(1) + x(2)))*(1i)))/(- 144*cos(2*(pi)*(8*x(1)(1i) - x(2)(1i))*(1i)) + 400*cos(2*(pi)*(8*x(1)(1i) + x(2)(1i))*(1i)) - 306*sin(2*(pi)*(8*x(1)(1i) - x(2)(1i))(1i))(1i) + 850*sin(2*(pi)*(8*x(1)(1i) + x(2)(1i))(1i))(1i) + 900*sin(2*(pi)x(2))(1i));

Где x (1), x (2) - толщины структуры. Я хочу оптимизировать функцию, чтобы я мог получить значения толщины x (1), x (2), которые удовлетворяют:

  1. Максимальная передача (определено [T_coeff_opt * coe (T_coeff_opt)].
  2. Я хочу сделать это для диапазона [0, 2 * pi]. Поэтому для каждой точки фазы между [0, 2 * pi] я получу x (1), x (2), что дает мне правильная фаза с максимальной передачей. Я пытался сделать это с LSQNONLIN, но результаты не те, что я ожидал. Так что, возможно, есть какая-то другая функция, которая лучше обрабатывает сложные функции. Я использую для первоначального предположения для w (n- 1) [n> 2] предыдущее решение для создания гладкого (непрерывного) решения без большого количества скачков или разрывов. Также решение должно быть periodi c [2 * pi period]. Мой код выглядит так:
    startpoint = 1;

    endpoint = 360;
    dev = 360;
    x_p = linspace(-1,1,dev);
    T_phase = (pi)x_p;
    T_coeff_opt = @(x) (256(cos(2*(pi)*(2*x(1) + x(2))) - sin(2*(pi)*(2*x(1) + x(2)))*(1i)))/(- 144*cos(2*(pi)*(8*x(1)(1i) - x(2)(1i))*(1i)) + 400*cos(2*(pi)*(8*x(1)(1i) + x(2)(1i))*(1i)) - 306*sin(2*(pi)*(8*x(1)(1i) - x(2)(1i))(1i))(1i) + 850*sin(2*(pi)*(8*x(1)(1i) + x(2)(1i))(1i))(1i) + 900*sin(2*(pi)x(2))(1i));
    x0a = [0.4 0.6]; % Staring initial
    lb = [0.08 0.08]; % Lower bound of width
    ub = [1 1]; % Upper bound of width
    options.Algorithm = 'trust-region-reflective';
    options.StepTolerance = 1e-6;
    options.FunctionTolerance = 1e-30;
    options = optimoptions(@lsqnonlin,'Algorithm','trust-region-reflective', 'Display', 'off');
    F = @(x)Opt(x,startpoint,T_phase);
    [w(startpoint,:), resnorm(startpoint,:), residual(startpoint,:)] = lsqnonlin(F, x0a, lb,ub,options); 
    for i = startpoint+1:1:endpoint
       F = @(x)Opt(x,i,T_phase);
       counter = 0;
       [w(i,:), resnorm(i,:), residual(i,:)] = lsqnonlin(F, w(i-1,:),lb,ub,options); minRes = residual(i,:); 
       while (residual(i,:) > 1e-6 | counter < 10) % Trying to find a better solution.
          r = 0.0001*rand(1,1);
          [curr_w, resnorm(i,:), residual(i,:)] = lsqnonlin(F, r*w(i-1,:),lb,ub,options);
             if (residual(i,:) < minRes)
                minRes = residual(i,:);
                w(i,:) = curr_w;
             end
          counter = counter + 1;
       end
    end


    function F = Opt(x,i, T_phase)
        T_coeff_opt = ( 256*(cos(2*(pi)*(2*x(1) + x(2)))
                            -sin(2*(pi)*(2*x(1) + x(2)))*(1i)))
                     /(-144*cos(2*(pi)*(8*x(1)(1i) - x(2)(1i))*(1i))
                       +400*cos(2*(pi)*(8*x(1)(1i) + x(2)(1i))*(1i))
                       -306*sin(2*(pi)*(8*x(1)(1i) - x(2)(1i))(1i))(1i)
                       +850*sin(2*(pi)*(8*x(1)(1i) + x(2)(1i))(1i))(1i)
                       +900*sin(2*(pi)x(2))(1i));
       F(1) = (((T_coeff_opt)*conj(T_coeff_opt)) - 1);
       F(2) = (angle(T_coeff_opt) - (T_phase(i)));
    end

Форум Matlab не получил никаких новых идей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...