После решения линейной системы уравнений для нахождения коэффициента пропускания для диэлектрической 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), которые удовлетворяют:
- Максимальная передача (определено [T_coeff_opt * coe (T_coeff_opt)].
- Я хочу сделать это для диапазона [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 не получил никаких новых идей.