Contenuto principale

EquationProblem

Sistema di equazioni non lineari

Descrizione

Specificare un sistema di equazioni utilizzando variabili di ottimizzazione e risolvere il sistema utilizzando solve.

Suggerimento

Per il workflow completo, vedere Problem-Based Workflow for Solving Equations.

Creazione

Creare un oggetto EquationProblem utilizzando la funzione eqnproblem. Aggiungere equazioni al problema creando oggetti OptimizationEquality e impostandoli come proprietà Equations dell'oggetto EquationProblem.

prob = eqnproblem;
x = optimvar("x");
eqn = x^5 - x^4 + 3*x == 1/2;
prob.Equations.eqn = eqn;

Avviso

L'approccio basato sui problemi non supporta valori complessi nei seguenti casi: funzione obiettivo, uguaglianze non lineari e disuguaglianze non lineari. Se il calcolo di una funzione produce un valore complesso, anche solo come valore intermedio, il risultato finale potrebbe essere non corretto.

Proprietà

espandi tutto

Equazioni del problema, specificate come array OptimizationEquality o struttura con array OptimizationEquality come campi.

Esempio sum(x.^2,2) == 4

Etichetta del problema, specificata come stringa o vettore di caratteri. Il software non utilizza Description per il calcolo. Description è un'etichetta arbitraria che è possibile utilizzare per qualsiasi motivo. Ad esempio, è possibile condividere, archiviare o presentare un modello o un problema e memorizzare informazioni descrittive relative al modello o al problema in Description.

Esempio "An iterative approach to the Traveling Salesman problem"

Tipi di dati: char | string

proprietà è di sola lettura.

Variabili di ottimizzazione nell'oggetto, specificate come struttura di oggetti OptimizationVariable.

Tipi di dati: struct

Funzioni oggetto

evaluateEvaluate optimization expression or objectives and constraints in problem
issatisfiedConstraint satisfaction of an optimization problem at a set of points
optimoptionsCreare opzioni di ottimizzazione
prob2structConvert optimization problem or equation problem to solver form
showDisplay information about optimization object
solveSolve optimization problem or equation problem
solversDetermine default and valid solvers for optimization problem or equation problem
varindexMap problem variables to solver-based variable index
writeSave optimization object description

Esempi

comprimi tutto

Per risolvere il sistema di equazioni non lineari

exp(-exp(-(x1+x2)))=x2(1+x12)x1cos(x2)+x2sin(x1)=12

utilizzando l'approccio basato sui problemi, definire innanzitutto x come variabile di ottimizzazione a due elementi.

x = optimvar("x",2);

Creare la prima equazione come espressione di uguaglianza di ottimizzazione.

eq1 = exp(-exp(-(x(1) + x(2)))) == x(2)*(1 + x(1)^2);

In modo analogo, creare la seconda equazione come espressione di uguaglianza di ottimizzazione.

eq2 = x(1)*cos(x(2)) + x(2)*sin(x(1)) == 1/2;

Creare un problema di equazioni e inserire le equazioni nel problema.

prob = eqnproblem;
prob.Equations.eq1 = eq1;
prob.Equations.eq2 = eq2;

Esaminare il problema.

show(prob)
  EquationProblem : 

	Solve for:
       x


	eq1:
       exp((-exp((-(x(1) + x(2)))))) == (x(2) .* (1 + x(1).^2))

	eq2:
       ((x(1) .* cos(x(2))) + (x(2) .* sin(x(1)))) == 0.5

Risolvere il problema partendo dal punto [0,0]. Per l'approccio basato sui problemi, specificare il punto iniziale come struttura, con i nomi delle variabili come campi della struttura. In questo problema è presente una sola variabile, x.

x0.x = [0 0];
[sol,fval,exitflag] = solve(prob,x0)
Solving problem using fsolve.

Equation solved.

fsolve completed because the vector of function values is near zero
as measured by the value of the function tolerance, and
the problem appears regular as measured by the gradient.

<stopping criteria details>
sol = struct with fields:
    x: [2×1 double]

fval = struct with fields:
    eq1: -2.4070e-07
    eq2: -3.8255e-08

exitflag = 
    EquationSolved

Visualizzare il punto della soluzione.

disp(sol.x)
    0.3532
    0.6061

Funzioni non supportate che richiedono fcn2optimexpr

Se le funzioni dell'equazione non sono composte da funzioni elementari, è necessario convertire le funzioni in espressioni di ottimizzazione utilizzando fcn2optimexpr. Per l'esempio in questione:

ls1 = fcn2optimexpr(@(x)exp(-exp(-(x(1)+x(2)))),x);
eq1 = ls1 == x(2)*(1 + x(1)^2);
ls2 = fcn2optimexpr(@(x)x(1)*cos(x(2))+x(2)*sin(x(1)),x);
eq2 = ls2 == 1/2;

Vedere Supported Operations for Optimization Variables and Expressions e Convert Nonlinear Function to Optimization Expression.

Creare un insieme di equazioni in due variabili di ottimizzazione.

x = optimvar("x");
y = optimvar("y");
prob = eqnproblem;
prob.Equations.eq1 = x^2 + y^2/4 == 2;
prob.Equations.eq2 = x^2/4 + 2*y^2 == 2;

Risolvere il sistema di equazioni partendo da x=1,y=1/2.

x0.x = 1;
x0.y = 1/2;
sol = solve(prob,x0)
Solving problem using fsolve.

Equation solved.

fsolve completed because the vector of function values is near zero
as measured by the value of the function tolerance, and
the problem appears regular as measured by the gradient.

<stopping criteria details>
sol = struct with fields:
    x: 1.3440
    y: 0.8799

Valutare le equazioni nei punti x0 e sol.

vars = optimvalues(prob,x=[x0.x sol.x],y=[x0.y sol.y]);
vals = evaluate(prob,vars)
vals = 
  1×2 OptimizationValues vector with properties:

   Variables properties:
      x: [1 1.3440]
      y: [0.5000 0.8799]

   Equation properties:
    eq1: [0.9375 8.4322e-10]
    eq2: [1.2500 6.7431e-09]

Il primo punto, x0, presenta valori diversi da zero per entrambe le equazioni eq1 e eq2. Il secondo punto, sol, presenta valori quasi pari a zero in queste equazioni, come ci si aspetterebbe da una soluzione.

Identificare il grado di soddisfazione dell'equazione utilizzando issatisfied.

[satisfied details] = issatisfied(prob,vars)
satisfied = 1×2 logical array

   0   1

details = 
  1×2 OptimizationValues vector with properties:

   Variables properties:
      x: [1 1]
      y: [1 1]

   Equation properties:
    eq1: [0 1]
    eq2: [0 1]

Il primo punto, x0, non è una soluzione e satisfied è pari a 0 per quel punto. Il secondo punto, sol, è una soluzione e satisfied è pari a 1 per quel punto. Le proprietà delle equazioni mostrano che nessuna delle due è soddisfatta nel primo punto, mentre entrambe lo sono nel secondo punto.

Cronologia versioni

Introdotto in R2019b

espandi tutto