python - 使用 Python 使用 scipy fsolve 或 scipy.optimize.root 解决非线性系统的问题
问题描述
我有一个关于在 python 中求解方程组的问题。在这里,我提出了一个有 5 个方程的情况。显式系统是这样的:
定义 f(x):
F = numpy.array([x[0]*x[2]/(1+x[0]*x[2]) + x[0]*x[3]/(1+x[0]*x[3]) + x[0]*x[4]/(1+x[0]*x[4]) -2,
x[1]*x[2]/(1+x[1]*x[2]) + x[1]*x[3]/(1+x[1]*x[3]) + x[1]*x[4]/(1+x[1]*x[4]) - 2,
x[0]*x[2]/(1+x[0]*x[2]) + x[1]*x[2]/(1+x[1]*x[2]) -1,
x[0]*x[3]/(1+x[0]*x[3]) + x[1]*x[3]/(1+x[1]*x[3]) -2,
x[0]*x[4]/(1+x[0]*x[4]) + x[1]*x[4]/(1+x[1]*x[4]) -1,])
return F
我尝试过的另一种方法是:
F = numpy.zeros(5)
d = numpy.array([2,2])
u = numpy.array([1,2,1])
def f(x):
for i in range(2):
for k in range(3):
F[i] += x[i]*x[k+2]/(1+x[i]*x[k+2])
F[i] = F[i] - d[i]
for i in range(3):
for k in range(2):
F[i+2] += x[i+2]*x[k]/(1+x[k]*x[i+2])
F[i+2] = F[i+2] - u[i]
return F
现在,当我尝试:
a = [1,1,0.5,1,0,5] #initial guess
sol = fsolve(f,a)
第一个方法似乎没问题,并给出了解决方案:
array([2.63229589e+01, 2.63229589e+01, 3.79966918e-02, 2.11613301e+02,3.79966918e-02])
相反,第二个给出了初始猜测作为解决方案,因此,显然,什么都没有发生:
array([1. , 1. , 0.5, 1. , 0.5])
我不明白为什么第二种方法不起作用。我写了第二种情况,因为我必须解决的真实系统有数百个方程和数百个项(它们是求和的结果),所以我不能明确地写出来。这种只有 5 个方程的情况是我尝试过的简化情况,但我仍然不明白问题出在哪里。当我定义系统的方程 F 时,我认为在 f(x) 中具有“for”迭代循环,但是,我再一次不知道出了什么问题。
谁能帮我?
解决方案
推荐阅读
- javascript - 在嵌套的 json 对象中插入数据
- php - 如何将我的查询限制为每个类别仅获取 5 个产品?
- php - 使用 laravel voyager 管理面板部署 Web 应用程序
- html - 在图像上放置标题
- eclipse - 如何通过存储库更新更改 Eclipse 产品的 jre
- python - 将单个大文件从客户端加载到 dask 工作人员
- ruby-on-rails - 基于版本的 Rails 纸轨关联
- javascript - 该链接也在窗口和弹出窗口中打开
- mongodb - MongoDB 单一/中央 authSource 与多个/分布式 authSource
- gulp - Gulp:批量转换大量文件的自定义管道