Нахождение корней с Scipy.Optimize.root -- python поле с участием numpy поле с участием scipy пол Связанный проблема

Finding roots with scipy.optimize.root


1
vote

проблема

русский

Я пытаюсь найти root y функции, называемой f с помощью python.

Вот мой код:

 <код>  def f(y):     w,p1,p2,p3,p4,p5,p6,p7 = y[:8]      t1 = w - 0.500371726*(p1**0.92894164) - (-0.998515304)*((1-p1)**1.1376649)     t2 = w - 8.095873128*(p2**0.92894164) - (-0.998515304)*((1-p2)**1.1376649)     t3 = w - 220.2054377*(p3**0.92894164) - (-0.998515304)*((1-p3)**1.1376649)     t4 = w - 12.52760758*(p4**0.92894164) - (-0.998515304)*((1-p4)**1.1376649)     t5 = w - 8.710859537*(p5**0.92894164) - (-0.998515304)*((1-p5)**1.1376649)     t6 = w - 36.66350261*(p6**0.92894164) - (-0.998515304)*((1-p6)**1.1376649)     t7 = w - 3.922692207*(p7**0.92894164) - (-0.998515304)*((1-p7)**1.1376649)            t8 = p1 + p2 + p3 + p4 + p5 + p6 + p7 - 1     return [t1,t2,t3,t4,t5,t6,t7,t8]   x0 = np.array([-0.01,0.3,0.1,0.2,0.1,0.1,0.1,0.1]) sol = scipy.optimize.root(f, x0, method='lm') print sol  print 'solution', sol.x print 'success', sol.success   

python не находит корень, какой-либо метод, который я пытаюсь в Scipy.Optimize.root.

Однако есть один, я нашел его с функцией fsolve в matlab.

Это:

[- 0,0622, 0,5855, 0,087, 0,0028, 0,0568, 0,0811, 0,0188, 0,1679].

Когда я указываю x0 близко к корню, алгоритм Python сходится. Проблема в том, что я понятия не имею априори в корне, чтобы указать x0. На самом деле я решаю много уравнений этого типа.

Я действительно хочу использовать Python. Может кто-нибудь помочь мне сходиться с Python?

Английский оригинал

I am trying to find the root y of a function called f using Python.

Here is my code:

 def f(y):     w,p1,p2,p3,p4,p5,p6,p7 = y[:8]      t1 = w - 0.500371726*(p1**0.92894164) - (-0.998515304)*((1-p1)**1.1376649)     t2 = w - 8.095873128*(p2**0.92894164) - (-0.998515304)*((1-p2)**1.1376649)     t3 = w - 220.2054377*(p3**0.92894164) - (-0.998515304)*((1-p3)**1.1376649)     t4 = w - 12.52760758*(p4**0.92894164) - (-0.998515304)*((1-p4)**1.1376649)     t5 = w - 8.710859537*(p5**0.92894164) - (-0.998515304)*((1-p5)**1.1376649)     t6 = w - 36.66350261*(p6**0.92894164) - (-0.998515304)*((1-p6)**1.1376649)     t7 = w - 3.922692207*(p7**0.92894164) - (-0.998515304)*((1-p7)**1.1376649)            t8 = p1 + p2 + p3 + p4 + p5 + p6 + p7 - 1     return [t1,t2,t3,t4,t5,t6,t7,t8]   x0 = np.array([-0.01,0.3,0.1,0.2,0.1,0.1,0.1,0.1]) sol = scipy.optimize.root(f, x0, method='lm') print sol  print 'solution', sol.x print 'success', sol.success 

Python does not find the root whatever the method I try in scipy.optimize.root.

However there is one, I found it with the function fsolve in Matlab.

It is:

[-0.0622, 0.5855, 0.087, 0.0028, 0.0568, 0.0811, 0.0188, 0.1679].

When I specify x0 close to the root, the python algorithm converges. The problem is that I have no idea a priori on the root to specify x0. In reality I am solving many equations of this type.

I really want to use Python. Can anyone help me converge with python?

</div
        
         
         

Список ответов

10
 
vote
vote
Лучший ответ
 

ОК, после того, как некоторые одурачиваются, мы сосредоточены на другом аспекте хороших алгоритмов нахождения оптимизации / root. В приведенных выше комментариях мы пошли назад и вперед, вокруг какого метода Scipy.Optimize.root () для использования. Не менее важный вопрос для ближнего пуленепробиваемого «автоматического» поиска root в хороших первоначальных догадках. Часто хорошие первоначальные предположения, на самом деле, не рядом с реальным ответом вообще. Вместо этого они должны быть организованы, чтобы они естественным образом возглавили решателя в правильном направлении.

В вашем конкретном случае ваши догадки были на самом деле, отправляя алгоритм в странных направлениях.

Моя игрушечная реконструкция вашей проблемы:

 <код> import numpy as np import scipy as sp import scipy.optimize def f(y):     w,p1,p2,p3,p4,p5,p6,p7 = y[:8]     def t(p,w,a):                b = -0.998515304         e1 = 0.92894164         e2 = 1.1376649         return(w-a*p**e1 - b*(1-p)**e2)     t1 = t(p1,w,1.0)     t2 = t(p2,w,4.0)      t3 = t(p3,w,16.0)     t4 = t(p4,w,64.0)     t5 = t(p5,w,256.0)     t6 = t(p6,w,512.0)     t7 = t(p7,w,1024.0)            t8 = p1 + p2 + p3 + p4 + p5 + p6 + p7 - 1.0     return(t1,t2,t3,t4,t5,t6,t7,t8) guess = 0.0001 x0 = np.array([-1000.0,guess,guess,guess,guess,guess,guess,guess]) sol = sp.optimize.root(f, x0, method='lm') print('w=-1000: ', sol.x, sol.success,sol.nfev,np.sum(f(sol.x)))   

Обратите внимание, что я не использовал ваши особые предварительные производители (я хотел расширить диапазон, которую я исследовал), хотя я сохранил ваши особые показатели на сроках P.

Реальный секрет в первоначальном предположении, что я сделал то же самое для всех условий P. Имея это 0,1 или выше, бомбили большую часть времени, поскольку некоторые термины хотят идти в одну сторону и а другой. Снижение до 0,01 работала хорошо для этой проблемы. (Отмечу, что Wress Wress очень прочный - варьируется от -1000. До +1000. Не влияло на решение). Уменьшение первоначальной предположения, даже дальше не влияет на эту конкретную проблему, но это либо не повредит. Я бы держал это очень маленьким.

Да, вы знаете, что хотя бы некоторые термины будут намного больше. Но вы помещаете решатель в положение, где он может четко и напрямую перейти к реальному решению.

Удачи.

 

OK, after some fooling around, we focus on another aspect of good optimization/root finding algorithms. In the comments above we went back and forth around which method in scipy.optimize.root() to use. An equally important question for near-bulletproof 'automatic' root finding is zeroing in on good initial guesses. Often times, good initial guesses are, in fact, not near the real answer at all. Instead, they need to be arranged so that they will naturally lead the solver in the right direction.

In your particular case, your guesses were, in fact, sending the algorithm off in strange directions.

My toy reconstruction of your problem is:

import numpy as np import scipy as sp import scipy.optimize def f(y):     w,p1,p2,p3,p4,p5,p6,p7 = y[:8]     def t(p,w,a):                b = -0.998515304         e1 = 0.92894164         e2 = 1.1376649         return(w-a*p**e1 - b*(1-p)**e2)     t1 = t(p1,w,1.0)     t2 = t(p2,w,4.0)      t3 = t(p3,w,16.0)     t4 = t(p4,w,64.0)     t5 = t(p5,w,256.0)     t6 = t(p6,w,512.0)     t7 = t(p7,w,1024.0)            t8 = p1 + p2 + p3 + p4 + p5 + p6 + p7 - 1.0     return(t1,t2,t3,t4,t5,t6,t7,t8) guess = 0.0001 x0 = np.array([-1000.0,guess,guess,guess,guess,guess,guess,guess]) sol = sp.optimize.root(f, x0, method='lm') print('w=-1000: ', sol.x, sol.success,sol.nfev,np.sum(f(sol.x))) 

Note that I did not use your specific prefactors (I wanted to broaden the range I explored), although I kept your particular exponents on the p terms.

The real secret is in the initial guess, which I made the same for all p terms. Having it a 0.1 or above bombed much of the time, since some terms want to go one way and some the other. Reducing it to 0.01 worked well for this problem. (I will note that the w term is very robust - varying from -1000. to +1000. had no effect on the solution). Reducing the initial guess even further has no effect on this particular problem, but it does no harm either. I would keep it very small.

Yes, you know that at least some terms will be much larger. But, you are putting the solver in a position where it can clearly and directly proceed towards the real solution.

Good luck.

</div
 
 

Связанный проблема

0  После добавления клеток найдите мин и максимум пяти различных категорий в файле CSV  ( After appending cells find min and max of five different categories in a csv fi ) 
Привет всем У меня есть вопрос. Я просто сейчас изучаю мин и макс. У меня проблемы в нахождении мин и максимум пяти столбцов для каждой категории Вот, что...

0  Объедините несколько столов для ответа JSON в Django Read Framework  ( Combine multiple tables for a json response in django rest framework ) 
Я использую Django Read Framework для моего serializers . Мне нужно создать веб-сервис, который сочетает в себе поля в трех таблицах и дает JSON. У меня ес...

5  Как я могу получить Mercurial для того, чтобы снова выдвигать коммиты?  ( How can i get mercurial to push commits again ) 
Я не знаю, что я ничего изменил и работаю Ubuntu 10.10. Mercurial работает нормально, а затем внезапно, когда я начал толкать сегодня утром, я начал получать ...

2  подмодул .POPEN отказывается запускать команду, хотя OS.System работает нормально  ( Submodules popen refuses to run a command even though os system works fine ) 
Всякий раз, когда я запускаю этот скрипт: <код> gcalctool0 Я постоянно получаю эту ошибку: <код> gcalctool1 Тем не менее, <код> gcalctool2 определе...

0  Python / django - Начало Apache с mod_wsgi  ( Python django starting apache with mod wsgi ) 
пытается запустить mod_wsgi. Получение опорной ошибки связанной с FMOD. <код> [root@host]# mod_wsgi-express start-server wsgi.py --port=80 > --user www...

0  Запрос доступа от класса Inherit (View)  ( Access request from inherit class view ) 
Как я могу предъявить запрос на var, если я не реализую методы Get / Post из класса Inherit (View)? <код> class Base(View): def __init__(self): ...

0  Пытаясь создать dataframe из другого dataframe с определенными ограничениями  ( Trying to create a dataframe from another dataframe with certain restrictions ) 
Я пытаюсь написать модель VAR в Python (где не разрешается использовать предварительно сделанные функции, такие как var в Statsmodel). Для этого мне нужна м...

0  Как бы я избавился от определенных персонажей, а затем выпустите очищенную струну в Python?  ( How would i get rid of certain characters then output a cleaned up string in pyt ) 
В этом фрассетере кода я пытаюсь получить ссылки на изображения, размещенные в группеЧанчатке определенным пользователем: <код> import groupy from groupy im...

-4  Как суммировать значения при заворачивании аналогичного ключа, чтобы построить Dict  ( How to sum values when zipping similar key to build a dict ) 
У меня есть <код> A = [a, b, c, d, a, d, c] и <код> B=[1, 2, 3, 4, 5, 6, 7] Почему <код> dict(zip(A,B)) не возвращается <код> {'a': 6, 'b': 2, 'c': 10, '...

0  Почему это, если вернуться в Python  ( Why this if return true in python ) 
<Код> >>> if '' is not None: ... print'23333' ... 23333 Я думаю (не нет) верно и ('') неверно, так почему он работает печать? ...

1  Где многопроцессор  ( Where is multiprocessing process ) 
Я портирую рабочее приложение из Python 3.3-34 и столкнулся с странной ситуацией. Класс Multipressing.Process отсутствует в загрузке с Python.org. Вместо этог...

0  NameError: Имя «Домашние животные» не определены. Питон  ( Nameerror name pets is not defined python ) 
Это код, который я использую, но каждый раз, когда я пытаюсь запустить его, я получаю эту ошибку в терминале: <код> Traceback (most recent call last): Fil...

0  Jupyter Lab / Ubuntu / «Нет модуля по имени BCLZ»  ( Jupyter lab ubuntu no module named bcolz ) 
Bcolz был успешно установлен и может работать в Python3 (попробовал в терминале). Однако, когда я попробовал это в Jupyter Lab (или ноутбук), приходит ошибка:...

3  Использование None As Parameter к аргументу ключевого слова [дубликат]  ( Using none as parameter to keyword argument ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> Этот вопрос уже имеет ответ здесь : ...

0  Запуск сценария Python со значениями от Views.py в Django  ( Running a python script with values from views py in django ) 
Я пытаюсь передать значение, которое я получил в просмотру .py файл в django в другой сценарий python, который я написал, но я понятия не имею, как это сделат...

Связанный проблема

0  После добавления клеток найдите мин и максимум пяти различных категорий в файле CSV 
0  Объедините несколько столов для ответа JSON в Django Read Framework 
5  Как я могу получить Mercurial для того, чтобы снова выдвигать коммиты? 
2  подмодул .POPEN отказывается запускать команду, хотя OS.System работает нормально 
0  Python / django - Начало Apache с mod_wsgi 
0  Запрос доступа от класса Inherit (View) 
0  Пытаясь создать dataframe из другого dataframe с определенными ограничениями 
0  Как бы я избавился от определенных персонажей, а затем выпустите очищенную струну в Python? 
-4  Как суммировать значения при заворачивании аналогичного ключа, чтобы построить Dict 
0  Почему это, если вернуться в Python 
1  Где многопроцессор 
0  NameError: Имя «Домашние животные» не определены. Питон 
0  Jupyter Lab / Ubuntu / «Нет модуля по имени BCLZ» 
3  Использование None As Parameter к аргументу ключевого слова [дубликат] 
0  Запуск сценария Python со значениями от Views.py в Django