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)x1потому что(x2)+x2sin(x1)=12

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

x = optimvar('x',2);

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

ls1 = fcn2optimexpr(@(x)exp(-exp(-(x(1)+x(2)))),x);

Создайте первое уравнение.

eq1 = ls1 == x(2)*(1 + x(1)^2);

Точно так же создайте левую сторону второго уравнения при помощи fcn2optimexpr.

ls2 = fcn2optimexpr(@(x)x(1)*cos(x(2))+x(2)*sin(x(1)),x);

Создайте второе уравнение.

eq2 = ls2 == 1/2;

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

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

Рассмотрите проблему.

show(prob)
  EquationProblem : 

	Solve for:
       x


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

       where:

         anonymousFunction1 = @(x)exp(-exp(-(x(1)+x(2))));
         arg_LHS = anonymousFunction1(x);

 eq2:
       arg_LHS == 0.5

       where:

         anonymousFunction2 = @(x)x(1)*cos(x(2))+x(2)*sin(x(1));
         arg_LHS = anonymousFunction2(x);

Решите задачу, начинающую с точки [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.4069e-07
    eq2: -3.8255e-08

exitflag = 
    EquationSolved

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

disp(sol.x)
    0.3532
    0.6061

Введенный в R2019b