Решить нелинейную систему уравнений
используя основанный на проблеме подход, сначала определите 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;
Смотрите Поддерживаемые Операции над Переменными Оптимизации и Выражениями и Преобразование Нелинейной Функции в Выражение Оптимизации.