Introduzione a Optimize task di Live Editor basato sui problemi
Questo script di esempio consente di utilizzare Optimize task di Live Editor basato sui problemi per l'ottimizzazione o la risoluzione di equazioni. Modificare lo script in base al problema.
Lo script risolve un problema di ottimizzazione non lineare con vincoli non lineari:
Minimizzare soggetto al vincolo , dove e il punto iniziale ha . Imporre inoltre i limiti , .
Il codice relativo alla funzione obiettivo viene visualizzato alla fine di questo script.
Inclusione di parametri o dati
In genere, sono presenti dati o valori da passare al risolutore. Inserire tali valori nella sezione di input (dove si vedono x0x e x0y), quindi eseguire la sezione selezionando Section > Run Section (Sezione > Esegui sezione) oppure premendo Control+Enter.
Impostare i componenti del punto iniziale x0x e x0y e il ridimensionamento a per l'ottimizzazione.
x0x = -2; x0y = 2; a = 100;
Inserire tali valori e qualsiasi altro dato relativo al problema nel workspace eseguendo questa sezione prima di procedere.
Optimize task di Live Editor
Di solito, si inserisce Optimize task di Live Editor nello script selezionando Task > Optimize (Attività > Ottimizza) nella scheda del Live Editor oppure selezionando Task > Optimize (Attività > Ottimizza) nella scheda Insert (Inserisci). A questo punto viene presentata la seguente scelta (si tratta solo di un'immagine, non dell'attività vera e propria):

Per acquisire l'attività basata sui problemi, fare clic su Problem-based (Basata sui problemi) (consigliato).
La seguente attività basata su problema presenta variabili, obiettivo e vincolo già compilati. Modificare l'attività in base al problema oppure eseguirla senza modifiche per vedere come funziona. Per modificare il problema, fare clic sul pulsante Define problem (Definisci il problema) situato nella parte inferiore dell'attività. Per eseguire l'attività, fare clic sul pulsante Solve problem (Risolvi il problema) situato nella parte inferiore dell'attività.
OptimizationProblem :
Solve for:
x, y
minimize :
log(((1 + (100 .* (y - x.^2).^2)) + (1 - x).^2))
subject to :
(x.^2 + y.^2) <= 1
variable bounds:
-3 <= x <= 3
-2 <= y <= 9
Solving problem using fmincon. Local minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance. <stopping criteria details>
solution = struct with fields:
x: 0.7864
y: 0.6177
reasonSolverStopped =
OptimalSolution
objectiveValue = 0.0447
Interpretazione dei risultati
L'attività chiama solve che, a sua volta, chiama fmincon per risolvere il problema. La parte superiore dell'attività mostra che la soluzione viene restituita nella struttura solution. La soluzione riportata, x = 0.7864 e y = 0.6177, soddisfa il vincolo , come si può vedere dal seguente calcolo.
solution.x^2 + solution.y^2
ans = 1.0000
Il risolutore riporta la condizione di uscita OptimalSolution quando si arresta. Per interpretare questa condizione, osservare exitflag Output Arguments relativo al risolutore fmincon. La descrizione recita: "La misura di ottimalità di primo ordine è inferiore a options.OptimalityTolerance, mentre la violazione massima dei vincoli è inferiore a options.ConstraintTolerance". In altre parole, la soluzione è un minimo locale fattibile.
Il valore della funzione obiettivo nella soluzione è 0,0457. Si tratta del valore più piccolo della funzione obiettivo tra i punti fattibili.
Funzioni di supporto
Questo codice crea la funzione di supporto rosenbrock.
function objective = rosenbrock(x,y,a) % This function should return a scalar representing an optimization objective. % Example: Concession stand profit % revenue = 3*soda + 5*popcorn + 2*candy; % cost = 1*soda + 2*popcorn + 0.75*candy; % objective = revenue - cost; % profit % Edit the lines below with your calculations. objective = log(1 + a*(y - x^2)^2 + (1 - x)^2); end
