两个复方程中numpy的非线性根寻找

时间:2016-05-19 18:38:45

标签: python numpy scipy sympy

为什么计算不正确? 正确的解是c = 25.672,b2 = 10.24。 这里求解器返回输入值。 谢谢你的帮助!

from numpy import *
from scipy.optimize import *

#UNITS:
psi = 6895.
ft=0.3048
inch=0.0254
psisqin=psi*sqrt(inch)

#DATA:
K_Ict=1500.*psisqin
K_Icb=1700.*psisqin
sigma_2=6700.*psi
sigma_1=6000.*psi
sigma_3=7200.*psi
hp=105.*ft
P = 6500*psi

def f(p):
    b2,c= p
    F1 =  sqrt(pi*c)*(K_Icb-K_Ict)/2 - ( (sigma_2-sigma_1)*sqrt(c**2-b2**2) - (sigma_3-sigma_1)*sqrt(c**2-(hp-b2)**2) )
    F2 =  sqrt(pi)*(K_Icb+K_Ict)/(2*sqrt(c)) - ( (sigma_2-sigma_1)*arcsin(b2/c) + (sigma_3-sigma_1)*arcsin((hp-b2)/c) - (sigma_2+sigma_3-2*P)*pi/2 )
    return (F1,F2)

b2, c =  fsolve(f,(16.002,30))
print b2, c

1 个答案:

答案 0 :(得分:0)

不完全确定原因,但我认为这是因为你要离开范围之一,所以它只会返回你给出的边界。真正的原因取决于用于查找根的任何方法。 documentation州:

  

fsolve是MINPACK的hybrd和hybrj算法的包装。

这些算法有点超出我的专业知识,但您可以轻松找到有关它们的文档。这个link就是一个例子。

在任何情况下,如果你改变边界以包含你的根,你应该获得正确的结果(在公差范围内):

from numpy import *
from scipy.optimize import *

#UNITS:
psi = 6895.
ft=0.3048
inch=0.0254
psisqin=psi*sqrt(inch)

#DATA:
K_Ict=1500*psisqin
K_Icb=1700*psisqin
sigma_2=6700*psi
sigma_1=6000*psi
sigma_3=7200*psi
hp=105.*ft
P = 6500*psi

def f(p):
    b2,c= p
    F1 =  sqrt(pi*c)*(K_Icb-K_Ict)/2
    F1 =  sqrt(pi*c)*(K_Icb-K_Ict)/2 - ( (sigma_2-sigma_1)*sqrt(c**2-b2**2) - (sigma_3-sigma_1)*sqrt(c**2-(hp-b2)**2) )
    F2 =  sqrt(pi)*(K_Icb+K_Ict)/(2*sqrt(c)) - ( (sigma_2-sigma_1)*arcsin(b2/c) + (sigma_3-sigma_1)*arcsin((hp-b2)/c) - (sigma_2+sigma_3-2*P)*pi/2 )
    return (F1,F2)

b2, c =  fsolve(f,(9.002,30))
print(b2, c)

这导致:

10.2613616029 25.63857432