python - 使用 scipy 求解非线性方程组的错误
问题描述
我正在尝试使用 scipy.optimize.fsolve 来解决这个非线性方程组,我从这里的另一篇文章中的一个例子中得到了这个
我的方程组如下:
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])
我得到了同样的不匹配错误!
解决方案
显然问题出在这里:
形状应该是 (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,)
推荐阅读
- android - 如何在 Android 中使用无栏和全屏主题?
- html - 顶部 CSS 属性无法正常工作,而左侧工作正常
- javascript - 需要 ejs 文件中 app.js 中 html 标记的 ID
- python - 使用 sqlalchemy 将数据加载到 Oracle 数据库时,不允许使用“Multi”方法
- python - 按分组数据框上的前 n 个结果可视化列
- websocket - aiohttp websocket
- r - 在 R 中使用 age_calc 处理缺失数据
- java - 将应用部署到 Google Cloud 平台时未检测到相对文件路径
- json - 如何验证布尔值?
- php - WooCommerce:如何通过 REST API 检查用户授权