exponenta event banner

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