%% Plot NWSA cost function Global auf die x-Achse bezogen % Während eines Breakpoints in BerechneSpline_Rotor ausführen, damit die % entsprechend Daten alle da sind. clear all %% Skript für Plotbasics basics_plot %% Beginn P = [-8 8 8 -8 -8;0 0 3 3 0]; r = 0.45; z = [-8;-5]; %Needle Winding Simulation Algorithm %Anhand der aktuellen Konfiguration werden einzelne Drähte abgelegt, %in dem die optimale Poition für diesen Draht gesucht wird. W_opt = [0;0]; fval_opt = inf; wire_index = 1; calc_index = 1; NShift_iter_old = NaN; NShift_iter = 1; safety = 0.00; W0 = [0;max(P(2,:))-3*r]; % z = [-4.54;-25]; %z = [0;-100000] W_iter = []; % Output_Function_ga_fmincon = @(x1,x2,x3)outfun_ga_fmincon(x1,x2,x3,W_iter,P,r,safety); mycost1 = @(w) cost1(reshape(w,size(W0)),[],P,r,z); options = optimset('MaxIter',5000,'PlotFcns',[]); nlc = @(w) costInpoly(reshape(w,size(W0)),P,r); % gaoptions = gaoptimset('TolFun',1e-14,'Display','iter','HybridFcn',{@FMINCON,options},'OutputFcns',[],'PopulationSize',200); gaoptions = gaoptimset('TolFun',1e-14,'Display','iter','OutputFcns',[],'PopulationSize',200); fminconoptions = optimoptions('fmincon','Display','iter'); [W] = fmincon(mycost1,[r;0],[],[],[],[],[min(P(1,:)),min(P(2,:))+r],[max(P(1,:)),max(P(2,:))-r],nlc,fminconoptions) % [W,fval] = ga(mycost1,2,[],[],[],[],[],[],[],gaoptions); % W = fminsearch(mycost1,W, options); W=reshape(W,size(W0)); figure(1) clf plot(P(1,:),P(2,:)); hold on text(5,14,'NWSA'); circle(W(1,:),W(2,:),r,'black'); % circle(z(1),z(2),norm(z - W(:,end)),[0.75;0.75;0.75]) % text(W(1,1),W(2,1),num2str(1)); % text(W(1,2),W(2,2),num2str(2)); axis equal %% Algorithmus flag = 1; while flag == 1 %% Fmincon with 6 starting location if numel(wire_index)>110 test=0; end fval_iter = inf; for index_iter = 1:numel(wire_index) %Alle vorhandenen Drähte durchgehen if wire_index(index_iter) == 1 % Falls am aktuellen Draht noch einer dranpasst W_iter = [W(:,1:index_iter-1) W(:,index_iter+1:end) W(:,index_iter)]; if calc_index(index_iter) == 1 %#ok %Falls eine Neu-Berechnung erforderlich ist %index_iter %#ok Output_fun_FMinCon = @(alpha,optimValues,state) outfun(alpha,optimValues,state,W_iter,P,r,safety); mycost = @(alpha) cost(alpha,W_iter,P,r,safety,z);% %mynonLinCon = @(alpha) nonLinConstraints(alpha,W_iter,P,r,safety); %Output_Function_ga_fmincon = @(x1,x2,x3)outfun_ga_fmincon(x1,x2,x3,W_iter,P,r); % Genetic Algorithm mit Nebenbedingungen fminconoptions = optimoptions('fmincon','MaxIter',10000,'Display','none','MaxFunEvals',10000000,... 'OutputFcn',[],'TolX',1e-15,'TolCon',1e-8); %gaoptions = gaoptimset('EliteCount',1,'TolFun',1e-14,'Display','off','HybridFcn',[],'OutputFcns',[],... % 'PopulationSize',50,'InitialPopulation',[pi/3 -pi/3 -pi:(2*pi/47):pi]'); %[alpha_iter,fval] = ga(mycost,1,[],[],[],[],-pi,pi,[],gaoptions); %fval_best = Inf; alphaiter=zeros(6,1); fval=zeros(6,1); parfor tryiter=1:6 [alphaiter(tryiter),fval(tryiter)] = fmincon(mycost,(tryiter*pi/3-pi),[],[],[],[],-2*pi,2*pi,[],fminconoptions); end [fval_best,minidx] = min(fval); alpha_iter_best = alphaiter(minidx); W_iter = [W_iter W_iter(:,end)+[cos(alpha_iter_best)*2*(r+safety);sin(alpha_iter_best)*2*(r+safety)]]; %#ok if costIntersect(W_iter,r)+costInpoly(W_iter,P,r) > 10 %beim aktuellen Draht kann keine valide Position mehr angefügt werden W_iter = W_iter(:,1:end-1); %#ok wire_index(index_iter) = 0; %#ok else %Aktueller Draht ist möglich Top_alpha(index_iter) = alpha_iter_best; %#ok %Ergebnis zwischenspeichern if fval_best < fval_iter %Falls dieser Draht besser ist als der alte fval_iter = fval_best; %alpha_iter_opt = alpha_iter_best; %#ok W_iter_opt = W_iter; end end else %Es ist keine Berechnung erforderlich calc_index(index_iter) == 0 TopCost = cost(Top_alpha(index_iter),W_iter,P,r,safety,z); if TopCost < fval_iter %Falls dieser Draht besser ist als der alte fval_iter = TopCost; %alpha_iter_opt = Top_alpha(index_iter); W_iter_opt = [W_iter W_iter(:,end)+[cos(Top_alpha(index_iter))*2*(r+safety);sin(Top_alpha(index_iter))*2*(r+safety)]]; end end %Berechnung erforderlich? end %Falls an diesem Wire noch was angelegt werden kann end %alle Wire_index sind durch if sum(wire_index) == 0 %Wenn es keine Draht mehr gibt, an dem angehängt werden kann. flag = 0; %Fertig else W = [W W_iter_opt(:,end)]; d = squareform(pdist(W')); %Alle benachbarten Drähte neu berechnen lassen [row,col] = find(d<4.1*r); %Wenn sie näher als 5*radius dran sind. calc_index = zeros(size(calc_index)); for i=1:size(row,1) if row(i) ~= col(i) %falls zwei unterschiedliche Drähte so nah aneinander liegen if col(i)==size(d,2) %Nur Distanzen von letzen Draht anschauen calc_index(row(i)) = 1; %dann sollen sie neu berechnet werden. end end end wire_index = [wire_index 1]; %#ok calc_index = [calc_index 1]; %#ok % if NShift_iter == NShift_iter_old %Falls nicht beim ersten mal figure(1) circle(W(1,end),W(2,end),r,'black'); % frame = getframe(gcf); % 'gcf' can handle if you zoom in to take a movie. % writeVideo(writerObj, frame); % circle(z(1),z(2),norm(z - W(:,end)),[0.75;0.75;0.75]) % text(W(1,end),W(2,end),num2str(size(W,2))); drawnow else %Falls das erste mal die aktuelle Konfiguration gezeichnet wird. figure(1) clf plot(P(1,:),P(2,:)); hold on text(5,14,'NWSA'); circle(W(1,:),W(2,:),r,'black'); % circle(z(1),z(2),norm(z - W(:,end)),[0.75;0.75;0.75]) % text(W(1,1),W(2,1),num2str(1)); % text(W(1,2),W(2,2),num2str(2)); axis equal % axis([min(P(1,:))-1 max(P(1,:))+1 min(P(2,:))-1 max(P(2,:))+1]) % frame = getframe(gcf); % 'gcf' can handle if you zoom in to take a movie. % writeVideo(writerObj, frame); drawnow end % NShift_iter_old = NShift_iter; % end end %Alle möglichen Drähte abgelegt if size(W_opt,2) numel(labels) % stillrunning = 0; % end % end % % set(gca,'XTickLabel',tickresult); % % % end xlabel('$\alpha_{k,i}$ {[\SI{}{\degree}]}') ylabel('Normalized Value $\tilde{J}_{j,i}/\min\tilde{J}_{j,i}$') catch blub =0; end %% Tikzn matlab2tikz('filename','fitnessNWSA.tex',... 'height', '\figureheight', 'width', '\figurewidth', 'encoding', 'UTF8', 'showInfo', false, 'checkForUpdates', false, ... 'parseStrings', false, ... % switch off LaTeX parsing by matlab2tikz for titles, axes labels etc. ("greater flexibility", "use straight LaTeX for your labels") 'floatFormat', '%.4g', ... % limit precision to get smaller .tikz files 'noSize', false); % % axis off % % hold off % box off % Box um die figure herum ausblenden % mit legendflex hat man mehr Möglichkeiten als mit MATLABs eigener % legend-Funktion % legendflex({'LF', 'UF'}, ... % 'box', 'off', ... % 'ncol', 1, ... % 'nrow', 2, ... % 'anchor', [3, 3], ... % 'buffer', [-30, -30], ... % 'xscale', 0.5, ... % 'padding', [0, 0, 20], ... % 'Color', [1, 1, 1], ... % 'Interpreter', 'latex', ... % 'fontsize', 11) tightfig; % tightfig entfernt den weißen Rand um die figure herum % for i = 1:length(ax) % % decimal_comma(ax(i), 'XY') % für deutsche Veröffentlichungen kann hiermit der Dezimalpunkt durch ein Dezimal komma ersetzt werden % myArrow(ax(i), 'y') % Die Funkion fügt je nach zweitem Argument einen Achsenpfeil hinzu % end % FileName_Res = './Figures/PathOptim'; % Dateiname für LaTeX-Export definieren % Plot2LaTeX(fig_Res, FileName_Res) % Plot2LaTeX erzeugt aus der figure eine SVG-Datei und daraus ein PDF + LaTeX-Datei für den Text