我想申請fsolve到數組:有沒有一種方法可以將fsolve矢量化?
from __future__ import division
from math import fsum
from numpy import *
from scipy.optimize import fsolve
from scipy.constants import pi
nu = 0.05
cn = [0]
cn.extend([pi*n - pi/4 for n in range(1, 5 +1)])
b = linspace(200, 600, 400)
a = fsolve(lambda a: 1/b + fsum([1/(b+cn[i]) for i in range(1, 5 +1)]) - nu*(sqrt(a) - 1)**2, 3)
這是默認不允許的:
TypeError: only length-1 arrays can be converted to Python scalars
是有辦法,我可以申請fsolve到一個數組?
編輯:
#!/usr/bin/env python
from __future__ import division
import numpy as np
from scipy.optimize import fsolve
nu = np.float64(0.05)
cn = np.pi * np.arange(6) - np.pi/4.
cn[0] = 0.
b = np.linspace(200, 600, 400)
cn.shape = (6,1)
cn_grid = np.repeat(cn, b.size, axis=1)
K = np.sum(1/(b + cn_grid), axis=0)
f = lambda a: K - nu*(np.sqrt(a) - 1)**2
a0 = 3. * np.ones(K.shape)
a = fsolve(f, a0)
print a
解決它。
位它給你一個「a」,而它應該是400個 - 對於每個「b」。查看原始帖子的編輯。 – Adobe
你說得對,我需要使用一個向量作爲初始猜測。我已經更新了這個建議。 –