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