Contenuto principale

Questa pagina è stata tradotta con la traduzione automatica. Fai clic qui per vedere l'ultima versione in inglese.

createOptimProblem

Creare una struttura di problema di ottimizzazione

Descrizione

problem = createOptimProblem(solverName) crea una struttura di problema di ottimizzazione vuota per il risolutore solverName.

problem = createOptimProblem(solverName,Name,Value) specifica opzioni aggiuntive utilizzando uno o più argomenti nome-valore.

esempio

Esempi

comprimi tutto

Creare una struttura del problema con le seguenti specifiche:

  • Risolutore fmincon

  • Algoritmo "interior-point"

  • Punto iniziale 2D casuale x0

  • La funzione di Rosenbrock come obiettivo

  • Limiti inferiori di –2

  • Limiti superiori di 2

La funzione di Rosenbrock per una variabile 2-D x è f(x)=100(x2-x12)2+(1-x1)2 (per i dettagli, vedere Constrained Nonlinear Problem Using Optimize Live Editor Task or Solver). Per specificare l'algoritmo "interior-point"", creare opzioni utilizzando optimoptions .

anonrosen = @(x)(100*(x(2) - x(1)^2)^2 + (1-x(1))^2);
opts = optimoptions(@fmincon,Algorithm="interior-point");
rng default % For reproducibility
problem = createOptimProblem("fmincon",...
    x0=randn(2,1),...
    objective=anonrosen,...
    lb=[-2;-2],...
    ub=[2;2],...
    options=opts);

Risolvi il problema partendo da problem.x0 chiamando fmincon .

[x,fval] = fmincon(problem)
Local minimum possible. Constraints satisfied.

fmincon stopped because the size of the current step is less than
the value of the step size tolerance and constraints are 
satisfied to within the value of the constraint tolerance.
x = 2×1

    1.0000
    1.0000

fval = 2.0603e-11

Cerca una soluzione migliore chiamando GlobalSearch .

gs = GlobalSearch;
[x2,fval2] = run(gs,problem)
GlobalSearch stopped because it analyzed all the trial points.

All 16 local solver runs converged with a positive local solver exit flag.
x2 = 2×1

    1.0000
    1.0000

fval2 = 2.1093e-11

In questo caso, sia fmincon che GlobalSearch giungono alla stessa soluzione.

Argomenti di input

comprimi tutto

Risolutore di ottimizzazione, specificato come uno dei seguenti.

  • Per GlobalSearch, specificare "fmincon" o @fmincon.

  • Per MultiStart, specificare "fmincon" o @fmincon, "fminunc" o @fminunc, "lsqnonlin" o @lsqnonlin, oppure "lsqcurvefit" o @lsqcurvefit.

Esempio "fmincon"

Tipi di dati: char | string | function_handle

Argomenti nome-valore

comprimi tutto

Specificare coppie facoltative di argomenti come Name1=Value1,...,NameN=ValueN, dove Name è il nome dell'argomento e Value è il valore corrispondente. Gli argomenti nome-valore devono comparire dopo gli altri argomenti, ma l'ordine delle coppie non ha importanza.

Prima di R2021a, utilizzare le virgole per separare ogni nome e valore e racchiudere Name tra virgolette.

Esempio createOptimProblem("fmincon","x0",x0,"objective",fun,"lb",zeros(size(x0)))

Vincoli di uguaglianza lineare, specificati come matrice reale. Aeq è una matrice Me per nvars, dove Me è il numero di uguaglianze.

Aeq codifica le uguaglianze lineari Me

Aeq*x = beq,

dove x è il vettore colonna delle variabili N x(:) e beq è un vettore colonna con elementi Me.

Ad esempio, per specificare

x1 + 2 x2 + 3 x3 = 10
2 x1 + 4 x2 + x3 = 20,

dare questi vincoli:

Aeq = [1,2,3;2,4,1];
beq = [10;20];

Esempio Per specificare che la somma delle variabili di controllo sia 1, specificare i vincoli Aeq = ones(1,N) e beq = 1.

Tipi di dati: double

Vincoli di disuguaglianza lineare, specificati come matrice reale. Aineq è una matrice M per nvars, dove M è il numero di disuguaglianze.

Aineq codifica le disuguaglianze lineari M

Aineq*x <= bineq,

dove x è il vettore colonna delle variabili nvars x(:) e bineq è un vettore colonna con elementi M.

Ad esempio, per specificare

x1 + 2x2 ≤ 10
3x1 + 4x2 ≤ 20
5x1 + 6x2 ≤ 30,

dare questi vincoli:

Aineq = [1,2;3,4;5,6];
bineq = [10;20;30];

Esempio Per specificare che la somma delle variabili di controllo sia pari o inferiore a 1, specificare i vincoli Aineq = ones(1,N) e bineq = 1.

Tipi di dati: double

Vincoli di uguaglianza lineare, specificati come vettore reale. beq è un vettore di elementi Me correlato alla matrice Aeq. Se si passa beq come vettore riga, i risolutori convertono internamente beq nel vettore colonna beq(:).

beq codifica le uguaglianze lineari Me

Aeq*x = beq,

dove x è il vettore colonna delle variabili N x(:) e Aeq è una matrice di dimensione Meq per N .

Ad esempio, per specificare

x1 + 2 x2 + 3 x3 = 10
2 x1 + 4 x2 + x3 = 20,

dare questi vincoli:

Aeq = [1,2,3;2,4,1];
beq = [10;20];

Esempio Per specificare che la somma delle variabili di controllo sia 1, specificare i vincoli Aeq = ones(1,N) e beq = 1.

Tipi di dati: double

Vincoli di disuguaglianza lineare, specificati come vettore reale. bineq è un vettore di elementi M correlato alla matrice Aineq. Se si passa bineq come vettore riga, i risolutori convertono internamente bineq nel vettore colonna bineq(:).

bineq codifica le disuguaglianze lineari M

Aineq*x <= bineq,

dove x è il vettore colonna delle variabili N x(:) e Aineq è una matrice di dimensione M per N .

Ad esempio, per specificare

x1 + 2x2 ≤ 10
3x1 + 4x2 ≤ 20
5x1 + 6x2 ≤ 30,

dare questi vincoli:

Aineq = [1,2;3,4;5,6];
bineq = [10;20;30];

Esempio Per specificare che la somma delle variabili di controllo sia pari o inferiore a 1, specificare i vincoli Aineq = ones(1,N) e bineq = 1.

Tipi di dati: double

Limiti inferiori, specificati come array reale o array di double. lb rappresenta i limiti inferiori elemento per elemento in lb x ub .

Internamente, createOptimProblem converte un array lb nell'array lb(:).

Esempio lb = [0;-Inf;4] significa x(1) ≥ 0, x(3) ≥ 4 .

Tipi di dati: double

Vincoli non lineari, specificati come funzione handle o nome di funzione. nonlcon è una funzione che accetta un array x e restituisce due array, c(x) e ceq(x).

  • c(x) è l'array di vincoli di disuguaglianza non lineare in x . Il risolutore tenta di soddisfare c(x) <= 0 per tutte le voci di c .

  • ceq(x) è l'array di vincoli di uguaglianza non lineari in x . Il risolutore tenta di soddisfare ceq(x) = 0 per tutte le voci di ceq .

Ad esempio, nonlcon è una funzione MATLAB® come la seguente:

function [c,ceq] = nonlcon(x)
c = ...     % Compute nonlinear inequalities at x.
ceq = ...   % Compute nonlinear equalities at x.

Per ulteriori informazioni, vedere Nonlinear Constraints .

Tipi di dati: char | string | function_handle

Funzione obiettivo, specificata come funzione handle o nome di funzione.

  • Per tutti i risolutori, eccetto lsqnonlin e lsqcurvefit, la funzione obiettivo deve accettare un array x e restituire uno scalare. Se l'opzione SpecifyObjectiveGradient è true, la funzione obiettivo deve restituire un secondo output, un vettore che rappresenta il gradiente dell'obiettivo. Per i dettagli, vedere fun .

  • Per lsqnonlin, la funzione obiettivo deve accettare un vettore x e restituire un vettore. Se l'opzione SpecifyObjectiveGradient è true, la funzione obiettivo deve restituire un secondo output, una matrice che rappresenta lo Jacobiano dell'obiettivo. Per i dettagli, vedere fun .

  • Per lsqcurvefit, la funzione obiettivo deve accettare due input, x e xdata, e restituire un vettore. Se l'opzione SpecifyObjectiveGradient è true, la funzione obiettivo deve restituire un secondo output, una matrice che rappresenta lo jacobiano dell'obiettivo. Per i dettagli, vedere fun .

Esempio @sin

Esempio "sin"

Tipi di dati: char | string | function_handle

Opzioni di ottimizzazione, specificate come output di optimoptions .

Esempio optimoptions("fmincon","SpecifyObjectiveGradient",true)

Limiti superiori, specificati come array reale o array di double. ub rappresenta i limiti superiori elemento per elemento in lb x ub.

Internamente, createOptimProblem converte un array ub nell'array ub(:).

Esempio ub = [Inf;4;10] significa x(2) ≤ 4, x(3) ≤ 10 .

Tipi di dati: double

Punto iniziale, specificato come array reale o vettore reale. I risolutori utilizzano il numero di elementi in x0 e la dimensione di x0 per determinare il numero e la dimensione delle variabili accettate da fun.

Esempio x0 = [1,2,3,4]

Tipi di dati: double

Dati di input per il modello, specificati come array reale o array reale. Il modello è

ydata = fun(x,xdata),

dove xdata e ydata sono array fissi e x è l'array di parametri che lsqcurvefit modifica per cercare una somma minima dei quadrati.

Esempio xdata = [1,2,3,4]

Tipi di dati: double

Dati di risposta per il modello, specificati come array reale o array reale. Il modello è

ydata = fun(x,xdata),

dove xdata e ydata sono array fissi e x è l'array di parametri che lsqcurvefit modifica per cercare una somma minima dei quadrati.

L'array ydata deve avere le stesse dimensioni e forma dell'array fun(x0,xdata).

Esempio ydata = [1,2,3,4]

Tipi di dati: double

Argomenti di output

comprimi tutto

Problema di ottimizzazione, restituito come struttura. Utilizzare problem come secondo argomento di input di run, come negli esempi seguenti:

x = run(gs,problem)
x = run(ms,problem,k)

È anche possibile risolvere il problema richiamando il risolutore denominato relativo al problema. Ad esempio, se problem viene creato per fmincon, immettere

x = fmincon(problem)

Cronologia versioni

Introdotto in R2010a