이 GEKKO 스크립트가 더 나은 솔루션을 제공하지 않는 이유는 무엇입니까?

Optiman

다음은 내 코드입니다. 제약 조건 abs (expr1) = abs (expr2)가 주어지면 표현식 abs (expr1)을 최대화하고 있습니다.

import numpy as np
from gekko import GEKKO

#init
m = GEKKO(remote=False)

x2,x3,x4,x5,x6,x7,x8 = [m.Var(lb=-2*np.pi, ub=2*np.pi) for i in range(7)]

#constraint
m.Equation((1/8)*m.abs(m.cos((1/2)*x6)*(m.sin(x2)*m.sin(x4)*m.sin((1/2)*x7)*((-4)*m.cos(x3)*m.cos((1/2)*x5)*m.cos(x8)+(3+m.cos(x5))*m.sin(x3)*m.sin(x8))+m.cos(x2)*m.cos((1/2)*x7)*m.sin((1/2)*x4)*(8*m.cos(x3)*m.cos(x5)*m.cos(x8)+(-1)*(5*m.cos((1/2)*x5)+3*m.cos((3/2)*x5))*m.sin(x3)*m.sin(x8)))) == (1/8)*m.abs(m.sin((1/2)*x6)*(4*m.cos(x3)*m.cos(x8)*(m.cos((1/2)*x5)*m.cos((1/2)*x7)*m.sin(x2)*m.sin(x4)+2*m.cos(x2)*m.cos(x5)*m.sin((1/2)*x4)*m.sin((1/2)*x7))+(-1)*m.sin(x3)*((3+m.cos(x5))*m.cos((1/2)*x7)*m.sin(x2)*m.sin(x4)+m.cos(x2)*(5*m.cos((1/2)*x5)+3*m.cos((3/2)*x5))*m.sin((1/2)*x4)*m.sin((1/2)*x7))*m.sin(x8))))

#objective
m.Obj(-((1/8)*m.abs(m.cos((1/2)*x6)*(m.sin(x2)*m.sin(x4)*m.sin((1/2)*x7)*((-4)*m.cos(x3)*m.cos((1/2)*x5)*m.cos(x8)+(3+m.cos(x5))*m.sin(x3)*m.sin(x8))+m.cos(x2)*m.cos((1/2)*x7)*m.sin((1/2)*x4)*(8*m.cos(x3)*m.cos(x5)*m.cos(x8)+(-1)*(5*m.cos((1/2)*x5)+3*m.cos((3/2)*x5))*m.sin(x3)*m.sin(x8))))))

#Set global options
m.options.IMODE = 3 

#execute
m.solve()

#output
print('')
print('Results')
print('x2: ' + str(x2.value))
print('x3: ' + str(x3.value))
print('x4: ' + str(x4.value))
print('x5: ' + str(x5.value))
print('x6: ' + str(x6.value))
print('x7: ' + str(x7.value))
print('x8: ' + str(x8.value))

내가 얻는 해결책은 유효한 해결책이지만 최선의 해결책은 아닌 모든 x_i = 0입니다. 예를 들면

x2,x3,x4,x5,x6,x7,x8 = 0.9046, 1.9540, 1.8090, 0, 1.8090, 6.2832, 4.3291

제약 조건을 충족하고 (소수점 5 자리까지) 목표는 -0.3003에 도달합니다 (아직 최고는 아니지만 예). 나는 공차 옵션을 가지고 놀려고했지만 소용이 없었다. 등식 제약을 제거하면 목표가 최대 값 -1에 올바르게 도달합니다.

솔버가 제로 솔루션을 사용하지 않는 이유는 무엇입니까?

존 헤덴 그렌

Gekko의 솔버는 전역 최소화 기가 아니라 로컬 최소화 기입니다. 문제는 sincos함수에 많은 지역 최소값이 있습니다. 다중 시작 방법 또는 시뮬레이션 된 어닐링 과 같은 전역 접근 방식을 사용하여 전역 최소값을 얻을 수 있습니다 . 다중 시작 방법으로 스크립트 수정을 사용했습니다. -2*np.pi사이의 임의 값 2*np.pi은 변수를 초기화하는 데 사용됩니다.

for xi in x:
    xi.value = np.random.rand(20)*4*np.pi - 2*np.pi

IMODE=2 이 모든 경우를 동시에 해결합니다.

m.options.IMODE = 2

많은 경우를 수행해야하는 경우 여러 스레드를 사용하여이 계산을 병렬화 할 수 있습니다 . 또한 0에서 비 연속 미분 문제를 방지 하려면 m.abs3대신로 전환해야 m.abs합니다. 또 다른 전략은 절대 값을 피하기 위해 방정식의 양쪽을 제곱하는 것입니다. 다음은 완전한 버전입니다.

import numpy as np
from gekko import GEKKO

#init
m = GEKKO(remote=False)

x = [m.Var(lb=-2*np.pi, ub=2*np.pi) for i in range(7)]
for xi in x:
    xi.value = np.random.rand(20)*4*np.pi - 2*np.pi
x2,x3,x4,x5,x6,x7,x8 = x

#constraint
m.Equation((1/8)*m.abs3(m.cos((1/2)*x6)*(m.sin(x2)*m.sin(x4)*m.sin((1/2)*x7)*\
    ((-4)*m.cos(x3)*m.cos((1/2)*x5)*m.cos(x8)+(3+m.cos(x5))*m.sin(x3)*m.sin(x8))+\
    m.cos(x2)*m.cos((1/2)*x7)*m.sin((1/2)*x4)*(8*m.cos(x3)*m.cos(x5)*m.cos(x8)+\
    (-1)*(5*m.cos((1/2)*x5)+3*m.cos((3/2)*x5))*m.sin(x3)*m.sin(x8)))) == \
    (1/8)*m.abs3(m.sin((1/2)*x6)*(4*m.cos(x3)*m.cos(x8)*(m.cos((1/2)*x5)*\
    m.cos((1/2)*x7)*m.sin(x2)*m.sin(x4)+2*m.cos(x2)*m.cos(x5)*m.sin((1/2)*\
    x4)*m.sin((1/2)*x7))+(-1)*m.sin(x3)*((3+m.cos(x5))*m.cos((1/2)*x7)*\
    m.sin(x2)*m.sin(x4)+m.cos(x2)*(5*m.cos((1/2)*x5)+3*m.cos((3/2)*x5))*\
    m.sin((1/2)*x4)*m.sin((1/2)*x7))*m.sin(x8))))

#objective
obj = m.Intermediate(-((1/8)*m.abs3(m.cos((1/2)*x6)*(m.sin(x2)*m.sin(x4)*\
    m.sin((1/2)*x7)*((-4)*m.cos(x3)*m.cos((1/2)*x5)*m.cos(x8)+(3+m.cos(x5))*\
    m.sin(x3)*m.sin(x8))+m.cos(x2)*m.cos((1/2)*x7)*m.sin((1/2)*x4)*(8*m.cos(x3)*\
    m.cos(x5)*m.cos(x8)+(-1)*(5*m.cos((1/2)*x5)+3*m.cos((3/2)*x5))*\
    m.sin(x3)*m.sin(x8))))))
m.Obj(obj)

#Set global options
m.options.IMODE = 2

#execute
m.solve()

#output
print('')
print('Best Result')
i = np.argmin(obj.value)
print('x2: ' + str(x2.value[i]))
print('x3: ' + str(x3.value[i]))
print('x4: ' + str(x4.value[i]))
print('x5: ' + str(x5.value[i]))
print('x6: ' + str(x6.value[i]))
print('x7: ' + str(x7.value[i]))
print('x8: ' + str(x8.value[i]))
print('obj: ' + str(obj.value[i]))

목표가 -0.5 인 최상의 솔루션이 여러 개 있습니다.

Best Result
x2: -3.1415936876
x3: 6.2545093655
x4: 3.1415896007
x5: -2.0848973806e-05
x6: -4.7122128433
x7: -4.712565114
x8: 0.029076147797
obj: -0.50000008426
Best Result
x2: -3.1416640191
x3: 3.1415941185
x4: 3.1415948958
x5: -3.1416088732
x6: 1.5708701192
x7: -4.7124627728
x8: -3.1415893349
obj: -0.5000000992

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

이 소나무 스크립트가 더 이상 작동하지 않는 이유는 무엇입니까?

분류에서Dev

mariadb 파티셔닝이 더 나은 성능을 제공하지 않는 이유는 무엇입니까?

분류에서Dev

apport가 수정되지 않는 이유는 무엇이며 비활성화하는 것보다 더 나은 솔루션이 있습니까?

분류에서Dev

이 Javascript 스크립트가 개미 출력을 제공하지 않는 이유는 무엇입니까?

분류에서Dev

이 스크립트가 무한 루프로 끝나지 않는 이유는 무엇입니까?

분류에서Dev

Recycler View가 목록보기보다 더 나은 경험을 제공하는 이유는 무엇입니까?

분류에서Dev

dd를 사용한 디스크 복제가 실제 데이터 크기보다 더 많은 공간을 차지하는 이유는 무엇입니까?

분류에서Dev

Visual Studio에서 다른 버전의 타이프 스크립트가 필요한 솔루션을 관리하는 방법은 무엇입니까?

분류에서Dev

Clonezilla로 복제 한 디스크가 소스보다 더 많은 공간을 차지하는 이유는 무엇입니까?

분류에서Dev

GEKKO가 초기 측정을 선택하지 않는 이유는 무엇입니까?

분류에서Dev

angularJS의 테이블에 행을 추가하는 더 나은 솔루션

분류에서Dev

자바 스크립트 'if 문'이 정의되지 않은 것을 반환하는 이유는 무엇입니까?

분류에서Dev

가상 박스 VM을 가져온 후 더 많은 공간을 차지하는 이유는 무엇입니까?

분류에서Dev

솔루션의 모든 프로젝트 EXE 및 DLL 파일을 하나의 공통 폴더에 복사하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

`python`을 추가하지 않고 다른 폴더에서 파이썬 스크립트를 호출하는 방법은 무엇입니까?

분류에서Dev

작동하는 독립형 중첩 함수 / 스크립트가 더 큰 스크립트 내에서 작동하지 않는 이유는 무엇입니까?

분류에서Dev

내 PHP 웹 사이트가 CSS 나 링크를 렌더링하지 않는 이유는 무엇입니까?

분류에서Dev

다음 스크립트가 새 탭이나 페이지를 열지 않는 이유는 무엇입니까?

분류에서Dev

더 이상 소리가 나지 않는 이유는 무엇입니까?

분류에서Dev

더 이상 소리가 나지 않는 이유는 무엇입니까?

분류에서Dev

두 가지 유사한 방식으로 제약 조건을 fmincon에 공급하여 다른 솔루션을 얻는 이유는 무엇입니까?

분류에서Dev

이 솔루션에서 더 작은 화면에서 Jumbotron 높이를 줄이지 않는 이유는 무엇입니까?

분류에서Dev

Déjà Dup이 시작되거나 SMB 공유가 마운트되었을 때 스크립트를 시작하는 방법은 무엇입니까?

분류에서Dev

Déjà Dup이 시작되거나 SMB 공유가 마운트되었을 때 스크립트를 시작하는 방법은 무엇입니까?

분류에서Dev

이 스크립트가 출력을 생성하지 않는 이유는 무엇입니까?

분류에서Dev

이 VB 스크립트가 이메일을 보내지 않는 이유는 무엇입니까?

분류에서Dev

터미널을 여는 시작 스크립트가 작동하지 않는 이유는 무엇입니까?

분류에서Dev

자바 스크립트가 요소에 스타일을 적용하지 않는 이유는 무엇입니까?

분류에서Dev

이 스크립트가 작동하지 않는 이유는 무엇입니까?

Related 관련 기사

  1. 1

    이 소나무 스크립트가 더 이상 작동하지 않는 이유는 무엇입니까?

  2. 2

    mariadb 파티셔닝이 더 나은 성능을 제공하지 않는 이유는 무엇입니까?

  3. 3

    apport가 수정되지 않는 이유는 무엇이며 비활성화하는 것보다 더 나은 솔루션이 있습니까?

  4. 4

    이 Javascript 스크립트가 개미 출력을 제공하지 않는 이유는 무엇입니까?

  5. 5

    이 스크립트가 무한 루프로 끝나지 않는 이유는 무엇입니까?

  6. 6

    Recycler View가 목록보기보다 더 나은 경험을 제공하는 이유는 무엇입니까?

  7. 7

    dd를 사용한 디스크 복제가 실제 데이터 크기보다 더 많은 공간을 차지하는 이유는 무엇입니까?

  8. 8

    Visual Studio에서 다른 버전의 타이프 스크립트가 필요한 솔루션을 관리하는 방법은 무엇입니까?

  9. 9

    Clonezilla로 복제 한 디스크가 소스보다 더 많은 공간을 차지하는 이유는 무엇입니까?

  10. 10

    GEKKO가 초기 측정을 선택하지 않는 이유는 무엇입니까?

  11. 11

    angularJS의 테이블에 행을 추가하는 더 나은 솔루션

  12. 12

    자바 스크립트 'if 문'이 정의되지 않은 것을 반환하는 이유는 무엇입니까?

  13. 13

    가상 박스 VM을 가져온 후 더 많은 공간을 차지하는 이유는 무엇입니까?

  14. 14

    솔루션의 모든 프로젝트 EXE 및 DLL 파일을 하나의 공통 폴더에 복사하는 가장 좋은 방법은 무엇입니까?

  15. 15

    `python`을 추가하지 않고 다른 폴더에서 파이썬 스크립트를 호출하는 방법은 무엇입니까?

  16. 16

    작동하는 독립형 중첩 함수 / 스크립트가 더 큰 스크립트 내에서 작동하지 않는 이유는 무엇입니까?

  17. 17

    내 PHP 웹 사이트가 CSS 나 링크를 렌더링하지 않는 이유는 무엇입니까?

  18. 18

    다음 스크립트가 새 탭이나 페이지를 열지 않는 이유는 무엇입니까?

  19. 19

    더 이상 소리가 나지 않는 이유는 무엇입니까?

  20. 20

    더 이상 소리가 나지 않는 이유는 무엇입니까?

  21. 21

    두 가지 유사한 방식으로 제약 조건을 fmincon에 공급하여 다른 솔루션을 얻는 이유는 무엇입니까?

  22. 22

    이 솔루션에서 더 작은 화면에서 Jumbotron 높이를 줄이지 않는 이유는 무엇입니까?

  23. 23

    Déjà Dup이 시작되거나 SMB 공유가 마운트되었을 때 스크립트를 시작하는 방법은 무엇입니까?

  24. 24

    Déjà Dup이 시작되거나 SMB 공유가 마운트되었을 때 스크립트를 시작하는 방법은 무엇입니까?

  25. 25

    이 스크립트가 출력을 생성하지 않는 이유는 무엇입니까?

  26. 26

    이 VB 스크립트가 이메일을 보내지 않는 이유는 무엇입니까?

  27. 27

    터미널을 여는 시작 스크립트가 작동하지 않는 이유는 무엇입니까?

  28. 28

    자바 스크립트가 요소에 스타일을 적용하지 않는 이유는 무엇입니까?

  29. 29

    이 스크립트가 작동하지 않는 이유는 무엇입니까?

뜨겁다태그

보관