使用Scipy求解非线性方程组的误差

时间:2018-08-13 16:25:48

标签: python scipy

我正在尝试使用scipy.optimize.fsolve来解决这个非线性方程组,我从另一篇here

中的示例中获取了这一点。

我的等式系统如下:

for i in range(len(self.time)-1):

            def equations(variable):
                k1,k2 = variable 
                f1 = -k1 + self.f(self.time[i]+ (0.5+np.sqrt(3)/6)* self.dt , self.u[i]+0.25*self.dt* k1+ (0.25+ np.sqrt(3)/6)*self.dt*k2) 
                f2 = -k2 + self.f(self.time[i]+ (0.5-np.sqrt(3)/6)* self.dt , self.u[i]+(0.25-np.sqrt(3)/6)*self.dt *k1 + 0.25*self.dt* k2)
                return (f1,f2)


            k1,k2 = fsolve(equations,(5,5))

当我运行得到的代码时:

TypeError: fsolve: there is a mismatch between the input and output shape of the 'func' argument 'equations'.Shape should be (2,) but it is (2, 1).

编辑,我不知道为什么不匹配以及如何解决.. 我尝试过:

for i in range(len(self.time)-1):
            ui = self.u[i]
            ti = self.time[i]

            def equations(variable):
                k1,k2 = variable 
                f1 = -k1 + self.f(ti+ (0.5+np.sqrt(3)/6)* self.dt , ui+0.25*self.dt* k1+ (0.25+ np.sqrt(3)/6)*self.dt*k2) 
                f2 = -k2 + self.f(ti+ (0.5-np.sqrt(3)/6)* self.dt , ui+(0.25-np.sqrt(3)/6)*self.dt *k1 + 0.25*self.dt* k2)
                return (f1,f2)


            k1,k2 = fsolve(equations,(1,1))

编辑 我已经尝试过:return np.array([f1,f2]) 和我有同样的不匹配错误!

1 个答案:

答案 0 :(得分:0)

显然问题出在这里:

  

形状应为(2,),但应为(2,1)。

即使只有两个值,在numpy中,具有两个值的“一维向量”和具有两个值的“二维矩阵”也不同。

我建议您调用ravel()flatten()(2,1)形状转换为(2,)形状:

import numpy as np

a = np.array([[1,2]])

print("before:")
print("array: ", a)
print("shape: ", a.shape)
print()

b = a.ravel()

print("after:")
print("array: ", b)
print("shape: ", b.shape)

> before:
> array:  [[1 2]]
> shape:  (1, 2)

> after:
> array:  [1 2]
> shape:  (2,)