Решить нелинейную систему уравнений
с помощью подхода, основанного на проблеме сначала задайте 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