EquationProblem

Система нелинейных уравнений

Описание

Задайте систему уравнений, используя переменные оптимизации, и решите систему используя solve.

Создание

Создайте EquationProblem объект при помощи eqnproblem функция. Добавьте уравнения к задаче путем создания OptimizationEquality объекты и установка их как Equations свойства EquationProblem объект.

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

Предупреждение

Основанный на проблеме подход не поддерживает комплексные числа в целевой функции, нелинейных равенствах и нелинейных неравенствах. Если при вычислении функции встретится комплексное число, даже как промежуточное значение, конечный результат может оказаться неправильным.

Свойства

расширить все

Уравнения задачи, заданные как OptimizationEquality массив или структура с OptimizationEquality массивы как поля.

Пример: sum(x.^2,2) == 4

Метка задачи, заданная как строковый или символьный вектор. Программное обеспечение не использует Description для расчетов. Description является произвольной меткой, которую можно использовать по любой причине. Например, вы можете делиться, архивировать, или представлять модель или задачу, и хранить описательную информацию о модели или проблеме в Description.

Пример: "An iterative approach to the Traveling Salesman problem"

Типы данных: char | string

Это свойство доступно только для чтения.

Переменные оптимизации в объекте, заданные как структура OptimizationVariable объекты.

Типы данных: struct

Функции объекта

optimoptionsСоздайте опции оптимизации
prob2structПреобразуйте задачу оптимизации или задачу уравнения в форму решателя
showОтобразите информацию об объекте оптимизации
solveРешите задачу оптимизации или уравнения
varindexСопоставьте переменные задачи с индексом переменной на основе решателя
writeСохраните описание объекта оптимизации

Примеры

свернуть все

Решить нелинейную систему уравнений

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

используя основанный на проблеме подход, сначала определите x как двухэлементная переменная оптимизации.

x = optimvar('x',2);

Создайте первое уравнение как выражение оптимизационного равенства.

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

Точно так же создайте второе уравнение как выражение оптимизационного равенства.

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

Создайте задачу уравнения и поместите уравнения в задачу.

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

Проверьте проблему.

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

Решите задачу, начиная с точки [0,0]. Для основанного на проблеме подхода задайте начальную точку как структуру с именами переменных в качестве полей структуры. Для этой задачи существует только одна переменная, 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.
sol = struct with fields:
    x: [2x1 double]

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

exitflag = 
    EquationSolved

Просмотрите точку решения.

disp(sol.x)
    0.3532
    0.6061

Неподдерживаемые функции требуют fcn2optimexpr

Если ваши функции уравнения не состоят из элементарных функций, необходимо преобразовать функции в выражения оптимизации с помощью fcn2optimexpr. Для настоящего примера:

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;

Смотрите Поддерживаемые Операции над Переменными Оптимизации и Выражениями и Преобразование Нелинейной Функции в Выражение Оптимизации.

Введенный в R2019b