주요 콘텐츠

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

EquationProblem

비선형 연립방정식

설명

최적화 변수를 사용하여 연립방정식을 지정하고 solve를 사용하여 풉니다.

전체 워크플로는 방정식 풀이를 위한 문제 기반 워크플로 항목을 참조하십시오.

생성

eqnproblem 함수를 사용하여 EquationProblem 객체를 만듭니다. OptimizationEquality 객체를 생성하고 생성한 객체를 EquationProblem 객체의 Equations 속성으로 설정하여 문제에 방정식을 추가합니다.

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

문제 레이블로, string형 또는 문자형 벡터로 지정됩니다. Description은 계산에 사용되지 않습니다. Description은 사용자가 어떠한 이유로든 필요하면 사용할 수 있는 임의의 레이블입니다. 예를 들어, 모델이나 문제를 공유하거나 아카이브하거나 표현할 때 그 모델이나 문제를 설명하는 정보를 Description에 저장할 수 있습니다.

예: "An iterative approach to the Traveling Salesman problem"

데이터형: char | string

읽기 전용 속성입니다.

객체의 최적화 변수로, OptimizationVariable 객체의 구조체로 지정됩니다.

데이터형: struct

객체 함수

evaluate문제의 최적화 표현식이나 목적 함수 및 제약 조건의 평가
issatisfiedConstraint satisfaction of an optimization problem at a set of points
optimoptions최적화 옵션 만들기
prob2structConvert optimization problem or equation problem to solver form
showoptimization 객체에 대한 정보 표시
solve최적화 문제 또는 방정식 문제 풀기
solversDetermine default and valid solvers for optimization problem or equation problem
varindexMap problem variables to solver-based variable index
writeSave optimization object description

예제

모두 축소

문제 기반 접근법을 사용하여 다음과 같은 비선형 연립방정식을 풀려면

exp(-exp(-(x1+x2)))=x2(1+x12)x1cos(x2)+x2sin(x1)=12

먼저 x를 요소를 2개 가진 최적화 변수로 정의합니다.

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.

<stopping criteria details>
sol = struct with fields:
    x: [2×1 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;

Supported Operations for Optimization Variables and Expressions 항목과 Convert Nonlinear Function to Optimization Expression 항목을 참조하십시오.

두 개의 최적화 변수로 일련의 방정식을 만듭니다.

x = optimvar("x");
y = optimvar("y");
prob = eqnproblem;
prob.Equations.eq1 = x^2 + y^2/4 == 2;
prob.Equations.eq2 = x^2/4 + 2*y^2 == 2;

x=1,y=1/2에서 시작하여 연립방정식을 풉니다.

x0.x = 1;
x0.y = 1/2;
sol = 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.

<stopping criteria details>
sol = struct with fields:
    x: 1.3440
    y: 0.8799

x0sol에서 방정식의 값을 계산합니다.

vars = optimvalues(prob,x=[x0.x sol.x],y=[x0.y sol.y]);
vals = evaluate(prob,vars)
vals = 
  1×2 OptimizationValues vector with properties:

   Variables properties:
      x: [1 1.3440]
      y: [0.5000 0.8799]

   Equation properties:
    eq1: [0.9375 8.4322e-10]
    eq2: [1.2500 6.7431e-09]

첫 번째 점 x0은 방정식 eq1eq2 모두에 대해 0이 아닌 값을 가집니다. 두 번째 점 sol은 이 방정식들에 대입했을 때 0에 가까운 값을 가집니다. 이는 해에 대해 예상할 수 있는 결과입니다.

issatisfied를 사용하여 방정식 충족 정도를 구합니다.

[satisfied details] = issatisfied(prob,vars)
satisfied = 1×2 logical array

   0   1

details = 
  1×2 OptimizationValues vector with properties:

   Variables properties:
      x: [1 1.3440]
      y: [0.5000 0.8799]

   Equation properties:
    eq1: [0 1]
    eq2: [0 1]

첫 번째 점 x0은 해가 아니며 이 점에 대해 satisfied0입니다. 두 번째 점 sol은 해이며 이 점에 대해 satisfied1입니다. Equation properties를 통해 두 방정식 모두 첫 번째 점에서는 충족되지 않고 두 번째 점에서는 모두 충족됨을 확인할 수 있습니다.

버전 내역

R2019b에 개발됨

모두 확장