2016-04-05 20 views
1

For döngüsünde scipy.optimize paketinden ikiye ayırma yöntemini kullanıyorum. Buradaki fikir, "eps_komp" vektöründeki her eleman (değer) için ikiye ayırma yöntemiyle "sig" değeri elde etmektir. Ben bu kadar kodlanmış ettik:Python: İşlev bir for döngüsü içinde bir değer almıyor

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) 

Şimdi 0'a eps_f (j) 'de "j" değerini değiştirirseniz:

eps_komp_j = eps_f(0) 

çalıştığını ve bu nedenle diğer tüm için yaptığı el ile eklediğim değerler, ancak for döngüsünde olduğu gibi tutarsam, "j" değeri otomatik olarak değişmez ve bir hata alıyorum:

f (a) ve f (b) sahip olmalıdır farklı işaretler

Kimsenin bir ipucu sorunu nedir ve bu nasıl çözülebilir?

Selamlar,

L

P.S. Dün bu konuyla ilgili başka bir konu yazdım, ama sorunla çok ilgili değildim ve olumsuz geri bildirim aldım. Ancak, bugün bunu çözmem gerekiyor, bu yüzden tekrar göndermeye zorlandım, ancak kodla biraz daha ileriye gitmeyi başardım, daha sonra yazıya girdim, bu yüzden bir repost değil ...

+2

Bir hata mesajı aldığınızda, lütfen sadece son iletiyi değil, * tam * izlemesini yapıştırın. –

+0

'j'nin döngü için doğru bir şekilde güncellenmediğine inanamıyorum. 'Print (j, eps_komp_j) 'ifadesini' sig_a.append' (insert.bisect ... '? –

+0

'dan önce girerseniz ne olur? Bu kodu çalıştırdığımda neden' ​​NameError: name' Emod 'tanımlı değil') [Minimal, Tam, Doğrulanabilir Örnek] (http://stackoverflow.com/help/mcve) –

cevap

1

Eğer read the docs Eğer bulacaksınız:

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.

kodunuzda: Bunu func(0) ve func(700) geçiyoruz

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

.

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 

Not işaretleri aynı birden çiftleri: Aşağıdaki çıktıyı almak print(func(0), func(700)) ile optimize.bisect hattını değiştirerek

. optimize.bisect bunları kaldıramıyor. Başarmak için 'un'u denediğini bilmiyorum, ama bu yanlış bir yaklaşım.

+0

Eğer yeni güncellediğim kodu çalıştırırsam ve "j" a atarsam Burada gerçek değer: eps_komp_j = eps_f (j) çalışır, bu doğru çalışır, düzgün çalışmayan tek şey döngüdür ... – mcluka

+0

"Çalışır" derken ne demek istiyorsun? eps_komp_j = eps_f (j) '(en azından şu anda yararlı bir şey yoktur) bu çıktıları üreten kod.' optimize.bisect' asla işe yaramayacaktır Bu özel yapılandırmada. –

+0

Eğer örneğin eps_komp_j = eps_f (3) 'i eklerseniz, vektör doğru değerle doldurulur, btu sadece vektör eps_komp ...' nın 4. (j = 3) elemanı için ... – mcluka