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
Для просмотра документации необходимо авторизоваться на сайте