2016-04-05 31 views
1

我在for循環中使用scipy.optimize包中的bisection方法。 這個想法是爲「eps_komp」向量中的每個元素(值)使用二分法獲得「sig」值。如果我在eps_f(J)變「J」的數值爲0Python:函數在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) 

現在:我編寫這麼多

eps_komp_j = eps_f(0) 

它的工作原理,因此它爲所有其他值,我手工插入,但如果我保持它就像它在for循環,「j」值不會自動改變,我得到一個錯誤:

f(a)和f(b)必須有不同的標誌

有沒有人有線索是什麼問題,這怎麼解決?

問候,

大號

P.S.我昨天在這個問題上發表了另一個話題,但我對這個問題並沒有很明確的看法,並得到了負面的反饋。不過,我今天確實需要解決這個問題,所以我不得不再次發佈它,但是我確實設法讓代碼更進一步,然後我在前一篇文章中做了更多,所以它不是轉貼...

+2

當您遇到錯誤時,請粘貼* full * traceback,而不僅僅是最終的消息。 –

+0

我不能相信'j'沒有被正確的for循環更新。如果你在'sig_a.append(optimize.bisect ...'?)之前插入'print(j,eps_komp_j)',會發生什麼? –

+0

有趣的是,當我運行這段代碼時,我得到'NameError:name'Emod'未定義你可能想看看如何發佈一個[最小,完整,可驗證的例子](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)

通過與print(func(0), func(700))我碰到下面的輸出替換optimize.bisect行:

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僅適用於向量eps_komp的第4個(j = 3)元素... – mcluka