Skip to content
Snippets Groups Projects
Minimization_Script.m 3.55 KiB
Newer Older
  • Learn to ignore specific revisions
  • Klaus Böhnlein's avatar
    Klaus Böhnlein committed
    clear all
    clc
    
    % --- Change PolynomialDisplayStyle ----
    % sympref('PolynomialDisplayStyle','ascend');
    % sympref('AbbreviateOutput',false);
    
    syms f_plus(v1,v2,q1,q2,q3,b1,b2,b3)
    assume( q1 > 0)
    assume( q2 > 0)
    assume( q3 > 0)
    % assume(q3 == q1);
    assume(q3 >= q1)
    assume(q2 >= q3)
    
    
    v = [v1; v2];
    
    %should be sqrt(2) instead of 2!
    f_plus(v1,v2,q1,q2,q3,b1,b2,b3) = q1*v1^4 + q2*v2^4+2*q3*v1^2*v2^2-2*(q1*b1*v1^2+ q2*b2*v2^2+sqrt(2)*q3*b3*v1*v2);
    f_minus(v1,v2,q1,q2,q3,b1,b2,b3) = q1*v1^4 + q2*v2^4+2*q3*v1^2*v2^2+2*(q1*b1*v1^2+ q2*b2*v2^2+sqrt(2)*q3*b3*v1*v2);
    
    
    % ---- Fix parameters
    % f_plus = subs(f_plus,b3,0)  % set b3
    % f_plus = subs(f_plus,q3,q1)
    
    % f_plus = subs(f_plus,q1,40);
    % f_plus = subs(f_plus,q3,63.9);
    % f_plus = subs(f_plus,q2,34.9);
    % f_plus = subs(f_plus,b1,4);
    % f_plus = subs(f_plus,b2,2.4);
    % f_plus = subs(f_plus,b3,2.4);
    
    % f_plus = subs(f_plus,q1,40);
    % f_plus = subs(f_plus,q3,20);
    % f_plus = subs(f_plus,q2,50);
    % f_plus = subs(f_plus,b1,5);
    % f_plus = subs(f_plus,b2,6);
    % f_plus = subs(f_plus,b3,7);
    
    f_plus = subs(f_plus,q1,40);
    f_plus = subs(f_plus,q3,63.9);
    f_plus = subs(f_plus,q2,70);
    rndm1 = randi([1 20],1,1);
    rndm2 = randi([1 20],1,1);
    rndm3 = randi([1 20],1,1);
    f_plus = subs(f_plus,b1,rndm1);
    f_plus = subs(f_plus,b2,rndm2);
    f_plus = subs(f_plus,b3,rndm3);
    
    
    f_minus = subs(f_minus,q1,40);
    f_minus = subs(f_minus,q3,63.9);
    f_minus = subs(f_minus,q2,70);
    f_minus = subs(f_minus,b1,rndm1);
    f_minus = subs(f_minus,b2,rndm2);
    f_minus = subs(f_minus,b3,rndm3);
    
    
    % Compute Gradient 
    df_plusx = diff(f_plus,v1);
    df_plusy = diff(f_plus,v2);
    
    df_minusx = diff(f_minus,v1);
    df_minusy = diff(f_minus,v2);
    
    
    eq1 = df_plusx == 0;
    eq2 = df_plusy == 0;
    eqns = [eq1, eq2]
    
    eq3 = df_minusx == 0;
    eq4 = df_minusy == 0;
    eqns_minus = [eq3, eq4]
    
    
    S = solve(eqns,v1,v2,'MaxDegree' , 5, 'Real', true);
    S_minus = solve(eqns_minus,v1,v2,'MaxDegree' , 5, 'Real', true);
    % S = solve(eqns,v1,v2,'MaxDegree' , 5);
    % S = solve(eqns,v1,v2,'MaxDegree' , 5, 'IgnoreAnalyticConstraints',true);
    % S = solve(eqns,v1,v2,'MaxDegree' , 5, 'IgnoreAnalyticConstraints',true, 'Real', true);
    % S = solve(eqns)
    
    
    A = S.v1;
    B = S.v2;
    A_minus = S_minus.v1;
    B_minus = S_minus.v2;
    % A = simplify(A);
    % B = simplify(B)
    % S_minus = solve(eqns_minus,v1,v2);
    % S_minus.v1
    % S_minus.v2
    
    %---------- TEST ---------------------
    % r = subs(subs(df_plusx,v1,A(3)),v2,B(3));
    fprintf('Testing equation grad(f) = 0  with stationary points')
    double(subs(subs(df_plusx,v1,A(1)),v2,B(1)))
    double(subs(subs(df_plusx,v1,A(2)),v2,B(2)))
    double(subs(subs(df_plusx,v1,A(3)),v2,B(3)))
    % ------------------------------------
    
    
    
    
    
    fprintf('print stationary points of f_plus:')
    double(A)
    double(B)
    fprintf('print stationary points of f_minus:')
    double(A_minus)
    double(B_minus)
    
    
    % determine global Minimizer from stationary points:
    fprintf('function values at stationary points:')
    T = arrayfun(@(v1,v2) double(f_plus(v1,v2,q1,q2,q3,b1,b2,b3)),A,B,'UniformOutput', false)
    T = cell2mat(T);
    Min_plus = min(T, [], 'all')
    
    
    % determine global Minimizer from stationary points:
    fprintf('function values at stationary points:')
    T_minus = arrayfun(@(v1,v2) double(f_minus(v1,v2,q1,q2,q3,b1,b2,b3)),A_minus,B_minus,'UniformOutput', false)
    T_minus = cell2mat(T_minus);
    Min_minus = min(T_minus, [], 'all')
    
    globalMinimizerValue = min(Min_plus,Min_minus)
    
    % Plot function
    fsurf(@(x,y) f_plus(x,y,q1,q2,q3,b1,b2,b3))
    hold on 
    plot3(A,B,T,'g*')
    % view(90,0)
    % view(2)
    
    
    figure
    fsurf(@(x,y) f_minus(x,y,q1,q2,q3,b1,b2,b3))
    hold on
    plot3(A_minus,B_minus,T,'g*')
    
    
    
    
    
    %Write to txt-File
    fileID = fopen('txt.txt','w');
    fprintf(fileID,'%s' , latex(S.v1));
    fclose(fileID);