Python: функция не получает значение в цикле for
Я использую метод деления пополам из пакета scipy.optimize внутри цикла for. Идея состоит в том, чтобы получить значение "sig" с помощью метода деления пополам для каждого элемента (значения) в векторе "eps_komp". Я написал это много:
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.01230539995,
0.022996934109999999,
-0.0037319012899999999,
0.023293921169999999,
0.0036927752099999997,
0.020621037629999998,
0.0063656587500000002,
0.020324050569999998,
-0.0025439530500000001,
0.018542128209999998,
0.01230539995,
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
PS Вчера я опубликовал еще одну тему по этой проблеме, но я не очень определился с проблемой и получил отрицательный отзыв. Однако мне нужно решить эту проблему сегодня, поэтому я был вынужден опубликовать его снова, однако мне удалось продвинуться немного дальше с кодом, чем я делал в предыдущем посте, так что это не репост...
1 ответ
Если вы прочитаете документы, то обнаружите, что:
Основная процедура деления пополам, чтобы найти ноль функции f между аргументами a и b. f (a) и f (b) не могут иметь одинаковые знаки. Медленно, но верно.
В вашем коде:
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.01230539995 -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.01230539995 -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
не могу справиться с этим. Я не знаю, чего вы пытаетесь достичь, но это неправильный подход.