2016-04-05 4 views
1

Я использую метод деления пополам из пакета scipy.optimize в цикле for. Идея состоит в том, чтобы получить значение «sig» с методом деления пополам для каждого элемента (значения) в векторе «eps_komp». Я закодирован это много:Python: функция не получает значения в цикле for

import numpy as np 
import scipy.optimize as optimize 

K=300 
n = 0.43 
E = 210000 
Rm = 700 
sig_a = [] 
RO_K = 300 
RO_n = 0.43 

eps_komp =  [0.00012893048999999997, 
0.018839115269999998, 
0., 
0.022996934109999999, 
-0.0037319012899999999, 
0.023293921169999999, 
0.0036927752099999997, 
0.020621037629999998, 
0.0063656587500000002, 
0.020324050569999998, 
-0.0025439530500000001, 
0.018542128209999998, 
0., 
0.019730076449999998, 
0.0045837363899999999, 
0.015275270549999997, 
-0.0040288883499999999, 
0.021215011749999999, 
-0.0031379271699999997, 
0.023590908229999999] 

def eps_f(i): 
    return eps_komp[i] 

for j in range(len(eps_komp)): 
    eps_komp_j = eps_f(j) 
    if j <= len(eps_komp): 
     def func(sig): 
      return eps_komp_j - sig/E - (sig/RO_K)**(1/RO_n) 
     sig_a.append(optimize.bisect(func, 0, Rm)) 
    else: 
     break 

print(sig_a) 

Теперь, если изменить значение «J» в eps_f (J) в 0:

eps_komp_j = eps_f(0) 

это работает, и поэтому он делает для всех остальных значения, которые я вставляю вручную, но если я сохраню его так, как он находится в цикле for, значение «j» не меняется автоматически, и я получаю сообщение об ошибке:

f (a) и f (b) должны иметь различные знаки

Кто-нибудь знает, в чем проблема, и как это можно решить?

Привет,

L

P.S. Вчера я опубликовал еще одну тему по этой проблеме, но я не очень разбирался в этой проблеме и получил отрицательную обратную связь. Тем не менее, мне нужно решить эту проблему сегодня, поэтому я был вынужден опубликовать ее снова, однако мне удалось немного улучшить код, который я сделал в предыдущем сообщении, поэтому это не repost ...

+2

Когда вы получите сообщение об ошибке, вставьте * full * traceback, а не только окончательное сообщение. –

+0

Я не могу поверить, что 'j' не обновляется корректным для цикла. Что произойдет, если вы вставляете 'print (j, eps_komp_j)' перед 'sig_a.append (optimize.bisect ...'? –

+0

Забавно, потому что, когда я запускаю этот код, я получаю 'NameError: name 'Emod' не определен' so вы можете захотеть посмотреть, как опубликовать [Минимальный, полный, проверенный пример] (http://stackoverflow.com/help/mcve) –

ответ

1

read the docs Если вы обнаружите, что:

Basic bisection routine to find a zero of the function f between the arguments a and b. f(a) and f(b) cannot have the same signs. Slow but sure.

В коде:

def func(sig): 
     return eps_komp_j - sig/Emod - (sig/RO_K)**(1/RO_n) 
    sig_a.append(optimize.bisect(func, 0, Rm)) 

вы передавая ему func(0) и func(700).

Заменяя optimize.bisect линию print(func(0), func(700)) я получаю следующий результат:

0.00012893048999999997 -7.177181168628421 
0.018839115269999998 -7.158470983848421 
0.-7.165004699168421 
0.02299693411 -7.15431316500842 
-0.00373190129 -7.1810420004084206 
0.02329392117 -7.154016177948421 
0.0036927752099999997 -7.173617323908421 
0.02062103763 -7.156689061488421 
0.00636565875 -7.17094444036842 
0.02032405057 -7.156986048548421 
-0.00254395305 -7.17985405216842 
0.018542128209999998 -7.15876797090842 
0.-7.165004699168421 
0.019730076449999998 -7.157580022668421 
0.00458373639 -7.172726362728421 
0.015275270549999997 -7.162034828568421 
-0.00402888835 -7.181338987468421 
0.02121501175 -7.156095087368421 
-0.0031379271699999997 -7.1804480262884205 
0.02359090823 -7.153719190888421 

Обратите внимание на несколько пар, которые имеют те же признаки. optimize.bisect не может справиться с этим. Я не знаю, что вы делаете , пытаясь выполнить, но это неправильный подход.

+0

, если вы запустите код, который я только что обновил, и назначьте «j» фактическое значение здесь: eps_komp_j = eps_f (j) он работает, поэтому это работает правильно, единственное, что работает неправильно, это цикл for ... – mcluka

+0

Что значит «это работает»? У меня есть eps_komp_j = eps_f (j) '(который, по крайней мере, в настоящий момент не приносит пользы) код, создавший эти выходы.' optimize.bisect' никогда не будет работать в этой конкретной конфигурации. –

+0

Хорошо, если вы вставляете 'eps_komp_j = eps_f (3)' например, вектор будет заполнен правильным значением, btu только для элемента 4 (j = 3) вектора eps_komp ... – mcluka