Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
1 / 1 / 0
Регистрация: 19.01.2013
Сообщений: 53

Не получается передать tuple в функцию scipy.fmin_powell

23.11.2022, 03:11. Показов 515. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача стоит так: найти минимум функции, реализовав метод многомерной оптимизации Коши, который сводится к одномерной оптимизации, причем для одномерной оптимизации использовать функцию scipy.optimize.fmin_powell

В функцию fmin_powell входят аргументы: функция, ndarray начальных значений тех переменных, по которым ведется оптимизация, tuple прочих аргументов, по которым оптимизация не ведется, а также прочие необязательные аргументы (см. https://docs.scipy.org/doc/sci... owell.html).

В коде я задаю функцию f(X), где X=[x1, x2], F1(X) и F2(X) (ее производные, как того требует метод Коши), функцию fXNew получения аргумента на новой итерации метода Коши и -

функцию одномерной оптимизации FindMin (которая служит для передачи в в fmin_powell).

Она принимает 2 аргумента: alfa -тот, по которому ведется одномерная оптимизация, (он в методе Коши служит параметром, по которому формируются аргументы X функции f(X) на следующей итерации), и сами эти аргументы X.

И подставляю в fmin_powell: FindMin, alfa, X.

Вот тут-то и пишет ошибку!

Код такой:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
from scipy.optimize import fmin_powell
import numpy as np
 
def f(X):
    x1=X[1-1]
    x2=X[2-1]
    y=8*x1**2 +4*x1*x2+5*x2**42
    return y
 
def calc_F1(X):  # komponent 1 gradient
    x1=X[1-1]
    x2=X[2-1]
    return 16*x1 + 4*x2
 
 
def calc_F2(X):  # komponent 2 gradient
    x1=X[1-1]
    x2=X[2-1]
    return 4*x1 + 10*x2
 
def fXNew(alfa, X0):
    x1_0=X0[1-1]
    x2_0=X0[2-1]
    x1_1=x1_0-alfa*calc_F1(X0)
    x2_1=x2_0-alfa*calc_F2(X0)
    X1=[x1_1,x2_1]
    return X1
    
 
def FindMin(alfa, X0):
    X1=fXNew(alfa, X0)
    return f(X1)
 
def fCompareX(X0, X1, eps):
    b=0
    for i in range(1, len(X0)+1):
        if abs(X1[i-1]-X0[i-1])>eps:
            b=1
    if b==0:
        v=1
    else:
        v=0
    return v
 
def main():
 
    x1 = -3
    x2 = 5
    eps1 = 0.001
    eps2 = 0.001
    M_iter = 100
    K_iter = 0
    #
    Xprev=[x1,x2]
    contin=1
    while contin==1:
        K_iter+=1
        alfa=fmin_powell(FindMin, 0.5, Xprev)
        Xnext= fXNew(alfa, Xprev)
        x1=Xnext[1-1]
        x2=Xnext[2-1]
        print("Iterations:{}, x1 = {}, x2 = {}, alfa = {}, func = {}".format(
        K_iter, x1, x2, alfa, whole_function(Xnext)))
        if f(Xnext)<eps1 or fCompareX(Xprev, Xnext, eps2)==1 or K_iter>=M_iter:
            break
        Xprev=Xnext
 
if __name__ == '__main__':
    main()
Пишет ошибку: can only concatenate tuple (not "list") to tuple
Причем исходит эта ошибка не из моего файла, а из библиотечного файла optimize.py
Но почему б ему не дописать в tuple новый элемент типа list? И как написать правильно?


Тогда я поступил по-другому. Теперь функция FindMin принимает один аргумент - P, и внутри этой функции срезами она разделяется на alfa и X.

Теперь:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
...
 
def FindMin(P):
    print("FindMin starts working P=", P) 
    alfa=P[1-1]
    print("alfa=", alfa)
    X0=P[2-1]
    print("X0=", X0)
    X1=fXNew(alfa, X0)
    print("FindMin finishes working X1=", X1)
    return f(X1)
 
...
 
def main():
 
    x1 = -3
    x2 = 5
    eps1 = 0.001
    eps2 = 0.001
    alfa_0=0.5
    M_iter = 100
    K_iter = 0
    Xprev=[x1, x2]
    contin=1
    while contin==1:
        K_iter+=1
        P=[alfa_0, Xprev]
        alfa=fmin_powell(FindMin, P) #here new version
        Xnext= fXNew(alfa, Xprev)
        x1=Xnext[1-1]
        x2=Xnext[2-1]
        print("Iterations:{}, x1 = {}, x2 = {}, alfa = {}, func = {}".format(
        K_iter, x1, x2, alfa, whole_function(Xnext)))
        if f(Xnext)<eps1 or fCompareX(Xprev, Xnext, eps2)==1 or K_iter>=M_iter:
            break
        Xprev=Xnext
 
...


И... опять проблема с fmin_powell - пишет:
Python
1
2
3
4
5
6
7
8
9
('FindMin starts working P=', array([0.5, list([-3, 5])]), dtype=object)
('alfa=', 0.5)
('X0=',[-3, 5])
('fXNew starts working X0=',[-3, 5], 'alfa=', 0.5)
('x1_0=', '-3', 'x2_0=', '5', 'x1_1=', '11.0', 'x2_1=', '-14.0')
('fXNew finishes working X1=',[11.0, -14.0])
('FindMin finishes working X1=',[11.0, -14.0])
...
TypeError: can only concatenate list (not float) to list
и снова ошибка эта из из библиотечного файла optimize.py
Но чего ж он теперь про tuple не пишет? В библиотечной функции это ж должен быть tuple!

Если я в main вместо
Python
1
P=[alfa_0, Xprev]
пишу
Python
1
P=(alfa_0, Xprev)
то ничего не меняется.

Притом что пример по приведенной выше ссылке работает:

Python
1
2
3
4
5
def f(x):
    return x**2
 
minimum = optimize.fmin_powell(f, -1)
print(minimum)
Работает и для многомерной оптимизации - если использовать fmin_powell для нахождения минимума функции f(x) не методом Коши, а напрямую этой функцией:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from scipy.optimize import fmin_powell
import numpy as np
 
def f(X):
    x1=X[1-1]
    x2=X[2-1]
    y=8*x1**2 +4*x1*x2+5*x2**42
    return y
 
x1=-3
x2=5
InitialGuess=np.array([x1, x2])
result=fmin_powell(f, InitialGuess)
 print result
В обоих случаях fmin_powell работает - и для одномерной, и для многомерной оптимизации, но в обоих случаях она не принимает этот tuple дополнительных аргументов! А в моей задаче надо чтоб принимала.

Подскажите, как правильно в нее аргументы передать и как правильно мою функцию
FindMin перестроить!
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.11.2022, 03:11
Ответы с готовыми решениями:

Не получается передать строку в функцию
Помогите, пожалуйста, не могу разобраться.... Вроде ничего сложного, но погуглив, найти пока что ничего тоже не получилось внятного. jQuery...

Не получается передать структуру в функцию
Имею такую проблему, при попытке передать мою структуру в функцию, получаю следующие ошибки: &quot;Settings::Settings(const Settings...

Не получается передать параметр в функцию
Подскажите, пожалуйста, хочу сделать так чтобы при наджатии кнопки фон страницы изменялся, но не получается передать параметр в функцию...

3
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
23.11.2022, 05:25
Просит кортеж, а вы упорно ему список подсовываете.
1
1 / 1 / 0
Регистрация: 19.01.2013
Сообщений: 53
23.11.2022, 20:53  [ТС]
Цитата Сообщение от Red white socks Посмотреть сообщение
Просит кортеж, а вы упорно ему список подсовываете.
а конкретнее?
Цитата Сообщение от aviacheslav Посмотреть сообщение
P=(alfa_0, Xprev)
Это что? Разве не кортеж? Я ж пишу:
Цитата Сообщение от aviacheslav Посмотреть сообщение
то ничего не меняется.
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
23.11.2022, 22:19
Лучший ответ Сообщение было отмечено aviacheslav как решение

Решение

aviacheslav, вы вот здесь
alfa=fmin_powell(FindMin, P)
в качестве начального значения даете кортеж из скаляра и кортежа. Начальное значение должно быть массивом, т.е состоять из однотипных объектов.

Добавлено через 21 минуту
Во второй версии своего кода вы начали творить вообще полную дичь.
А вам требовалось всего лишь обернуть список в кортеж.
58-я строка:
Python
1
alfa=fmin_powell(FindMin, 0.5, (Xprev,))
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.11.2022, 22:19
Помогаю со студенческими работами здесь

Не получается передать массив в функцию.
#include &lt;iostream&gt; #define n 20 #define m 30 using namespace std; void switcher (int** arr, int a, int b); int main() { ...

Не получается передать структуру в функцию
#include &lt;iostream&gt; using namespace std; struct Node { int e; int c; Node *next; };

Не получается передать аргументы в функцию
Доброго времени суток. Есть прототип функции, реализующей уточнение корней нелинейнеого уравнения методом итерации. код: iterations...

Не получается передать парметры через функцию
Пожалуйста объясните как передавать параметры через функцию.

Не получается передать строку в функцию по указателю
Формирую проект - консольное приложение в Visual Studio 2017. Поэтому нужно, чтобы выводились русские буквы в кодировке DOS, если я их...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru