середу, 17 лютого 2021 р.

Алгоритм пошуку мінімаксів для лінійно-кускових модульних виразів мовою Python3

     Модульні рівняння та нерівності

   Зразки розв'язування модульних рівнянь і нерівностей

Завдання. Створити алгоритм  мовою програмування Python3 для знаходження найменших та найбільших значень виразу з модулями вигляду: 

m*|x-a|+n*|x-b|+k*|x-c|,  

якщо  змінні a,b,с,m,n,k – це довільні натуральні  числа в середовищі програмування Thonny.

 

 Реалізація мовою програмування Python3

import random

print(" Пошук глобального  екстремуму(або MIN, або MAX)")

print("Вираз з модулями: m*|x-a|+n*|x-b|+k*|x-c|=?")

q=100

m=random.randint(-q,q)        # присвоєння випадкового цілого числа змінній m

n=random.randint(-q,q)          # присвоєння випадкового цілого числа змінній n

k=random.randint(-q,q)          # присвоєння випадкового цілого числа змінній k

a=random.randint(-q,q)        # присвоєння випадкового цілого числа змінній a

b=random.randint(-q,q)        # присвоєння випадкового цілого числа змінній b

c=random.randint(-q,q)      # присвоєння випадкового цілого числа змінній c

g=max([a,b,c]); q=min([a,b,c]); p=a+b+c-g-q; s=m+n+k

print("Точки екстремуму:","x1=",q, "x2=",p, "x3=", g)

print("Вираз з модулями:",m,"*|x-",q,"|+",n,"*|x-",p,"|+",k,"*|x-",g,"|")

print("Коефіцієнти:","m=",m, ";n=",n, ";k=", k, ";Сума: m+n+k=",m+n+k)

print("1-ий проміжок: x<",q)

if -m-n-k==0:

    F1=m*q+n*p+k*g; print("константа, якщо х<x1, F1(x)=", F1); FQ=F1   

elif -m-n-k<0:

    k1=-m-n-k; l1=m*q+n*p+k*g; FQ=k1*q+l1; X01=-l1/k1

    print("спадна, якщо х<x1, F1(x)=",k1,"*x+",l1,"FQ=",k1*q+l1,"X01=",-l1/k1) 

else:

    k1=-m-n-k; l1=m*q+n*p+k*g; FQ=k1*q+l1;X01=-l1/k1

    print("зростаюча, якщо х<x1, F1(x)=",k1,"*x+",l1,"FQ=",k1*q+l1,"X01=",-l1/k1)   

print("2-ий проміжок: xє[",q, ";",p,")")

if m-n-k==0:

    F2=-m*q+n*p+k*g; print("константа, якщо х<x1, F2(x)=", F2); FP=F2  

elif m-n-k<0:

    k2=m-n-k; l2=-m*q+n*p+k*g;FP=k2*p+l2; X02=-l2/k2

    print("спадна, якщо x1 < x < x2, F2(x)=",k2,"*x+",l2, "FP=",k2*p+l2,"X02=",-l2/k2) 

else:

    k2=m-n-k; l2=-m*q+n*p+k*g;   FP=k2*p+l2;X02=-l2/k2

    print("зростаюча, якщо x1 < x < x2, F2(x)=",k2,"*x+",l2,  "FP=",k2*p+l2, "X02=",-l2/k2) 

print("3-iй проміжок: xє[",p, ";",g,")")

if m+n-k==0:

    F3=-m*q-n*p+k*g; print("константа, якщо x2< х <x3, F3(x)=", F3);FG=F3  

elif -m+n+k<0:

    k3=m+n-k; l3=-m*q-n*p+k*g; FG=k3*g+l3; X03=-l3/k3

    print("спадна, якщо x2 < x < x3, F3(x)=",k3,"*x+",l3,  "FG=",k3*g+l3, "X03=",-l3/k3) 

else:

    k3=m+n-k; l3=-m*q-n*p+k*g; FG=k3*g+l3; X03=-l3/k3

    print("зростаюча, якщо x2 < x < x3, F3(x)=",k3,"*x+",l3,  "FG=",k3*g+l3,"X03=",-l3/k3)  

print("4-iй проміжок: xє[",g, "; +oo)") 

if +m+n+k==0:

    F4=-m*q-n*p-k*g; print("константа, якщо x3< х <+oo, F4(x)=", F4); FG=F4   

elif +m+n+k<0:

    k4=m+n+k; l4=-m*q-n*p-k*g; FG= k4*g+l4; X04=-l4/k4  

    print("спадна, якщо x3 < x < +oo, F4(x)=",k4,"*x+",l4, "FG=",k4*g+l4,"X04=",-l4/k4 ) 

else:

    k4=m+n+k; l4=-m*q-n*p-k*g; FG= k4*g+l4 

    print("зростаюча, якщо x3 < x < +oo, F4(x)=",k4,"*x+",l4, "FG=",k4*g+l4,"X04=",-l4/k4 )  

if m+n+k==0:

    MIN=min([FQ,FP,FG]); MAX=max([FQ,FP,FG])

    print("MIN=", MIN, "MAX=",MAX)

elif m+n+k<0:

    MIN=min([FQ,FP,FG]); MAX=max([FQ,FP,FG])

    print("Перелом ламаної =", MIN, "GLOBAL_MAX=",MAX)

else:

    MIN=min([FQ,FP,FG]); MAX=max([FQ,FP,FG])

    print("Перелом ламаної=", MAX, "GLOBAL_MIN=",MIN)


Результати виконання алгоритму:

   

Тест 1

 Пошук глобального  екстремуму(або MIN, або MAX)

Вираз з модулями: m*|x-a|+n*|x-b|+k*|x-c|=?

Точки екстремуму: x1= -36 x2= 21 x3= 66

Вираз з модулями: 0 *|x- -36 |+ -71 *|x- 21 |+ 25 *|x- 66 |

Коефіцієнти: m= 0 ;n= -71 ;k= 25 ;Сума: m+n+k= -46

1-ий проміжок: x< -36

зростаюча, якщо х<x1, F1(x)= 46 *x+ 159 FQ= -1497 X01= -3.4565217391304346

2-ий проміжок: xє[ -36 ; 21 )

зростаюча, якщо x1 < x < x2, F2(x)= 46 *x+ 159 FP= 1125 X02= -3.4565217391304346

3-iй проміжок: xє[ 21 ; 66 )

спадна, якщо x2 < x < x3, F3(x)= -96 *x+ 3141 FG= -3195 X03= 32.71875

4-iй проміжок: xє[ 66 ; +oo)

спадна, якщо x3 < x < +oo, F4(x)= -46 *x+ -159 FG= -3195 X04= -3.4565217391304346

LOCAL_MIN= -3195 GLOBAL_MAX= 1125


Тест 2

 Пошук глобального  екстремуму(або MIN, або MAX)

Вираз з модулями: m*|x-a|+n*|x-b|+k*|x-c|=?

Точки екстремуму: x1= -98 x2= -55 x3= 92

Вираз з модулями: 49 *|x- -98 |+ 77 *|x- -55 |+ 36 *|x- 92 |

Коефіцієнти: m= 49 ;n= 77 ;k= 36 ;Сума: m+n+k= 162

1-ий проміжок: x< -98

спадна, якщо х<x1, F1(x)= -162 *x+ -5725 FQ= 10151 X01= -35.339506172839506

2-ий проміжок: xє[ -98 ; -55 )

спадна, якщо x1 < x < x2, F2(x)= -64 *x+ 3879 FP= 7399 X02= 60.609375

3-iй проміжок: xє[ -55 ; 92 )

зростаюча, якщо x2 < x < x3, F3(x)= 90 *x+ 12349 FG= 20629 X03= -137.2111111111111

4-iй проміжок: xє[ 92 ; +oo)

зростаюча, якщо x3 < x < +oo, F4(x)= 162 *x+ 5725 FG= 20629 X04= -35.339506172839506

LOCAL_MAX= 20629 GLOBAL_MIN= 7399



****************************************

Алгоритм пошуку НСД та НСК на Python3

import random

a=84*random.randint(1,1000000)

b=105*random.randint(1,1000000)

def nsd(x,y):

    if x!=0:

        return nsd(y%x,x)

    else:

         return y

def nsk(x,y):

     return   (x//nsd(x,y))*y

print("HCD(",a,b,")=", nsd(a,b))

print("HCK(",a,b,")=", nsk(a,b))

*****************************

Алгоритм пошуку властивостей подільності

трицифрових чисел на Python3

import random

print("пошук властивостей числа: abc")

k=random.randint(100,998)

print("трицифрове число:",k)

a=k//100; print("цифра розряду сотень:",a)

b=(k-a*100)//10; print("цифра розряду десятків:",b)

c=k%10; print("цифра розряду одиниць:",c)

if (a!=b)and (a!=c)and (b!=c):

     print("немає рівних цифр")

if (a==b) or (b==c) or (a==c):

     print("має однакові цифри")

if (a==c):

    print("це число паліндромне")

g=max([a,b,c]); q=min([a,b,c])

p=a+b+c-g-q

if q+p>g:

     print("це трикутне число")

if g==p+q:

     print("це дивакувате число")

if g==p*q:

    print("це добуткове число")

if (g==p**2)or(g==q**2)or(p**2==q):

     print('це квадратоване число')

if (g==c)and(a==q)and(p==b):

     print('це неспадний порядок цифр числа')

if (g==a)and(q==c)and(p==b):

     print('це незростаючий порядок цифр числа')

if (c%2==0)and((a+b+c)%3==0)and((a+b+c)%9==0):

     print('це парне число, що ділиться на 3, на 6, на 9, на 18')

if (c%2==0)and(c%5==0)and((a+b+c)%3==0):

     print('це парне число, що ділиться на 3, на 6, на 10, на 15')

h=[2,3,5,7,11,13,17,19,23,29,31]

v=['None']*11

z=0

m=0

for j in range(len(h)):

    z=z+k%int(h[j])

    print("k=",k,"=", h[j],"*",k//int(h[j]), "+", k%int(h[j]))

    if k%int(h[j])==0:

        print("це складене число")

    else:

        m=m+1

if m==11:

   print("це просте число")

else:

     print("це складене число")


**********************************************

Алгоритм креслення куба  на Python3

import turtle                     

print("Алгоритм зміни позиції під час виконання куба")

t=turtle.Pen()

t.up()          #вказівка не залишати слід від пензлика      

t.goto(-50,-50)     #вказівка перемістити пензлик в точку (х, у)

t.down()     #вказівка залишати слід від пензлика

t.width(2)                   #вказівка товщини пензлика на 2 пікселі

t.color(0.4, 0.6, 0.1)    #вказівка кольору пензлика

for k in range(1, 3):   #вказівка повторення(цикл) дій від 1 до 2

    for j in range(1, 5):      #вказівка повторення(цикл) дій від 1 до 4

        t.shape('arrow')    #викликається новий виконавець вказівок в модулі turtle

        t.forward(200)           #вказіка руху вперед пензлика на 100 пікселів

        t.left(90)        #вказіка повороту пензлика вліво на 90 градусів

    t.width(3)      #зміна товщини пензлика на 3 пікселі

    t.goto(0,0)     #вказівка перемістити пензлик в точку (х, у)

    t.down()     #вказівка залишати слід від пензлика

t.color(0.0, 0.9, 0.5)

t.goto(0, 200)     #вказівка перемістити пензлик в точку (х, у)

t.goto(-50,150)     #вказівка перемістити пензлик в точку (х, у)     

t.goto(150,150)    #вказівка перемістити пензлик в точку (х, у)

t.goto(200,200)    #вказівка перемістити пензлик в точку (х, у)

t.goto(200,0)   #вказівка перемістити пензлик в точку (х, у)

t.goto(150,-50)   #вказівка перемістити пензлик в точку (х, у)


*******************************************

Алгоритм креслення 4-кутної піраміди  на Python3

import turtle

print("Алгоритм зміни позиції для виконавця піраміди")

t=turtle.Pen()

t.up()          #вказівка не залишати слід від пензлика      

t.goto(-100,-100)     #вказівка перемістити пензлик в точку (х, у)

t.down()     #вказівка залишати слід від пензлика

t.width(2)                   #вказівка товщини пензлика на 2 пікселі

t.color(0.4, 0.6, 0.1)    #вказівка кольору пензлика

t.goto(100, -100)     #вказівка перемістити пензлик в точку (х, у)

t.goto(130,-60)     #вказівка перемістити пензлик в точку (х, у)

t.goto(-70,-60)    #вказівка перемістити пензлик в точку (х, у)

t.goto(-100,-100)    #вказівка перемістити пензлик в точку (х, у)

t.up()       #вказівка не залишати слід від пензлика      

t.goto(15,-80)   #вказівка перемістити пензлик в точку (х, у)

t.down()     #вказівка залишати слід від пензлика

t.goto(15,220)   #вказівка перемістити пензлик в точку (х, у)

t.goto(-70,-60)   #вказівка перемістити пензлик в точку (х, у)

t.goto(130,-60)   #вказівка перемістити пензлик в точку (х, у)

t.goto(15,220)   #вказівка перемістити пензлик в точку (х, у)

t.goto(100, -100)     #вказівка перемістити пензлик в точку (х, у)

t.goto(-100, -100)     #вказівка перемістити пензлик в точку (х, у)

t.goto(15,220)   #вказівка перемістити пензлик в точку (х, у)

*********************************

Алгоритм креслення 

клітинкового квадрату 5х5  на Python3

import turtle                     # викликається  графічних  модуль turtle 

print(" Клітинковий квадрат розміром 5х5 від черепахи")

a=20                                #задається розмір клітинки в 20 пікселів

print("Перші 5 квадратів 1 від черепахи")

t=turtle.Pen()                 #задається об’єкт Реn(пезлик), якому даємо вказіки

t.width(2)                     #задається  вказіка товщини пензлика

t.up()                              #задається  вказіка підняти пензлик

t.forward(100)            #задається вказіка накреслити відрізок на 100 пікселів

t.down()                       #задається  вказіка опустити  пензлик

for j in range(1,6):         #вказівка циклу (повторення дій) з лічильником від 1 до 5 разів

    for i in range(1,5):       #вказівка вкладений цикл (повторення дій) з лічильником від 1 до 4 разів

        t.forward(a)              #команда креслення відрізка  а  пікселів

        t.left(90)                      #команда повороту олівця  на 90 градусів вліво

    a=a+20                             #команда збільшення сторони квадрату на 20 пікселів

t.forward(100)

t.left(90)

print("Другі 5 квадратів 2  від черепахи")

t.shape('arrow')         #задається змінна в графічному модулі turtle

t=turtle.Pen()          #задається об’єкт Реn(пезлик), якому даємо вказіки

t.up()                          #задається  вказіка підняти пензлик

t.goto(200,100)      #вказіка опустити пензлик в точці (х, у)

t.down()                 #задається  вказіка товщини пензлика

t.right(180)             #команда повороту олівця  на 180 градусів вправо

a=20                           #задається розмір клітинки в 20 пікселів

for j in range(1,6):          #вказівка  циклу з лічильником від 1 до 5

    for i in range(1,5):       #вказівка  циклу з лічильником від 1 до 4

        t.forward(a)            #команда креслення відрізка а пікселів

        t.left(90)             #команда повороту олівця  на 90 градусів

    a=a+20                #задається розмір клітинки ще на 20 пікселів більше

**************************************************************


Алгоритм гри "Відгадай число"  на Python3

Завдання 1. Самостійно створити набридливу гру «Відгадай число між 1 і 100» в середовищі програмування Thonny. І протестуй цю гру три рази.

Реалізація. В алгоритмі використовується тип даних: цілі числа

import random    # алгоритм запрошує модуль випадкових об’єктів

number=random.randint(1,100)  # змінна number отримує випадкове число

while True:    # це початок роботи цикли у передумовою

    print("Угадай число між 1 і 100" )

    guess=input()    # це користувач вводить своє число

    i=int(guess)      # це число перетворюється в ціле число

    if i==number:   # це  перевірка двох чисел на рівність

      print("Ура! Це відгадане число.")

      break             # це  вихід із програми, коли число вгадане

    elif i<number:     # це  перевірка двох чисел на нерівність

        print("Бери більше число")

    elif i>number:    # це  перевірка двох чисел на нерівність

        print("Бери менше число")

Завдання 2. Самостійно створити алгоритм, який обирає випадковим чином два слова із двох різних списків, а потім їх порівнює, якщо ці два слова різні, то алгоритм обирає інші слова, якщо ці два слова однакові, то алгоритм закінчує роботу. Реалізувати алгоритм  в середовищі програмування Thonny. І протестуй цю гру три рази.

Реалізація. В алгоритмі використовується тип даних списки.

import random                # алгоритм запрошує модуль випадкових об’єктів

dictionary=['ломбарди','страховики','кредитори','лихварі','позичальники', 'банки','бухгалетери']

words=['гроші','банки','євросики','кредитори','лихварі','гривні','ломбарди']

K=['None']*100                             #оголошується порожній список К

M=['None']*100                             #оголошується порожній список М

for n in range(0,100):            #оголошується цикл з лічильником n від 0 до 100

    K[n]=random.choice(dictionary)    # обирається перше випадкове слово

    M[n]=random.choice(words)            # обирається друге випадкове слово

    print("n=",n)

    print("K[",n,"]=",K[n])

    print("M[",n,"]=",M[n])

    if K[n]==M[n]:                       #оголошується перевірка двох випадкових слів

         print("Ура! Ці два слова однаков!!!")

         break                               #оголошується вихід із алгоритму

Завдання 3.  Створити алгоритм з діями над множинами чисел в в середовищі програмування Thonny. І протестуй цю програму три рази, змінивши елементи.

Реалізація. В алгоритмі використовується тип даних: множини чисел

A={10,9, 8,7,6,5}

print("Множина A=",A, type(A))

B={1,2, 3,4,5,6}

print("Множина B=",B, type(B))

C=A&B

print("Пертин двох множин C=А&B=",C, type(C))

D=A|B

print("Обєднання двох множин D=А|B=",D, type(D))

G=A-B

print("Різниця двох множин G=А-B=",G, type(G))

Q=B-A

print("Різниця двох множин Q=B-A=",Q, type(Q))

H=A^B

print("Симетрична різниця двох множин H=A^B=(А|B)-(A&B)=",H, type(H))

F=H|{12,11,10,9, 8,7,}

print("Доповнення порожньої множини F=",F, type(F))

F=F&{0,9, 8,7,6,5,4,3,2,1}

print("Перетин множини F з множиною цифр =",F, type(F))

F=F-{10,19, 8,7,6,5,4,3,2,1}

print("Різниця множини F з деякою множиною =",F, type(F))

F=F^{18,19, 8,7,6,5,4,3,2,1}

print("Симетрична різниця множини F з деякою множиною =",F, type(F))

Завдання 4.  Створити алгоритм з відношеннями  над множинами чисел в в середовищі програмування Thonny. І протестуй цю програму три рази, змінивши елементи.

Реалізація. В алгоритмі використовується тип даних: множини чисел

A={9, 8,7,6,5}

print("Множина A=",A, type(A))

B={1,9, 8,7,5,6}

print("Множина B=",B, type(B))

C1=A<B

print("Чи вірне таке відношення: C1=А<B:",C1, type(C1))

C2=B<A

print("Чи вірне таке відношення: C2=B<A:",C2, type(C2))

D1=A>B

print("Чи вірне таке відношення: D1=А>B:",D1, type(D1))

D2=B>A

print("Чи вірне таке відношення: D2=B>A:",D2, type(D2))

G=A>=B

print("Чи вірне таке відношення: G=А>=B:",G, type(G))

Q=B<=A

print("Чи вірне таке відношення: Q=B<=A:",Q, type(Q))

H=A==B

print("Чи вірне таке відношення: H=A==B:",H, type(H))

F=H in {12,11,10,9, 8,7,}

print("Чи вірне таке відношення: F=H in",F, type(F))

 

Завдання 5.  Створити алгоритм пошуку парних двохцифрових чисел, які діляться націло на 3 в середовищі програмування Thonny. І протестуй цю програму три рази, змінивши елементи.

Реалізація. В алгоритмі використовується тип даних: множини чисел

 

n=100

A={s for s in range(10, n)}

print("Множина A=",A, type(A))

B={s for s in A if s%2==0}

print("Множина парних чисел B=",B, type(B))

C1={s for s in A if s%3==0}

print("Множина чисел, що кратні 3, C1=",C1, type(C1))

C2= {s for s in A if s%6!=0}

print("Множина чисел, що не кратні 6, C2=",C2, type(C2))

D1=C1|C2

print("Множина D1=C1|C2",D1, type(D1))

D2=C1&C2

print("Множина D2=C1&C2",D2, type(D2))


 


Немає коментарів:

Дописати коментар