最近在做的东西中有一件任务,相当于一个函数已知y来求x,网上找了各种办法最终得以实现。在此说明方法,并记录一些坑。

要求的函数比如:*log(x) - log(1-x) + 2.2 * (1 -2x) *

最好用的方法,利用Scipy.optimize中的fsolve函数。

在该方法中,我们可以调用scipy.optimize.fsolve来求解非线性方程(组),具体方法如下:

from scipy.optimize import fsolve
import numpy as np # 按格式要求定义我们需要求的函数
def f(x):
return np.log(x) -np.log(1-x) + 2.2*(1-2x)
# 调用fsolve函数
sol_fsolve = fsolve(f, [0.1, 0.9]) # 第一个参数为我们需要求解的方程,第二个参数为方程解的估计值
print(sol_fsolve) [0.17071517 0.82928483]
# 输入两个解意味着根据你的估计值来进行梯度下降等算法找到的方程解。解的值域为(0,1),因此我估计为[0.1, 0.9]从而让函数从两边开始梯度下降,找到左右两个解
# 其实该方程有三个解,只是我不需要中间值的解,因此从左右两端估计

手动实现牛顿迭代法

牛顿迭代法是求非线性方程常用方法之一,具体原理如下:

https://blog.csdn.net/Robin__Chou/article/details/52103009

随后,附上python实现代码:

from sympy import *

x = symbols('x')
f = log(x) - log(1-x) +2.2*(1 - 2*x)
t = 0.01 # x每次的替代值
f1 = f.subs(x, t) # 表示t赋值给x while abs(f1) > 0.0001: #我们设定的精度
dify = diff(f, x) # f对x求导
dify = dify.subs(x, t)
t = t - f1/dify
f1 = f.subs(x, t) print('x=', x)

注:该方法只能找到你首次赋值t进行牛顿法的第一个解,要得到其余解还需自行调整t值

第三种方法失败的,用sympy

网上看到人说sympy求方程很好用,用了sympy.solve 以及sympy.solveset均发生错误,貌似是该函数无法解决非线性方程。

该包具体怎么用来实现求解非线性方程还没深究,也许以后会补上。

利用python求非线性方程的更多相关文章

  1. python求微分方程组的数值解曲线01

    本人最近在写一篇关于神经网络同步的文章,其一部分模型为: x_i^{\Delta}(t)= -a_i*x_i(t)+ b_i* f(x_i(t))+ \sum\limits_{j \in\{i-1, ...

  2. 利用Python科学计算处理物理问题(和物理告个别)

    背景: 2019年初由于尚未学习量子力学相关知识,所以处于自学阶段.浅显的学习了曾谨言的量子力学一卷和格里菲斯编写的量子力学教材.注重将量子力学的一些基本概念了解并理解.同时老师向我们推荐了Quant ...

  3. Python 数据分析(二 本实验将学习利用 Python 数据聚合与分组运算,时间序列,金融与经济数据应用等相关知识

    Python 数据分析(二) 本实验将学习利用 Python 数据聚合与分组运算,时间序列,金融与经济数据应用等相关知识 第1节 groupby 技术 第2节 数据聚合 第3节 分组级运算和转换 第4 ...

  4. 利用Python进行数据分析——Numpy基础:数组和矢量计算

    利用Python进行数据分析--Numpy基础:数组和矢量计算 ndarry,一个具有矢量运算和复杂广播能力快速节省空间的多维数组 对整组数据进行快速运算的标准数学函数,无需for-loop 用于读写 ...

  5. 利用Python代码编写计算器小程序

    import tkinter import tkinter.messagebox import math class JSQ: def __init__(self): #创建主界面 self.root ...

  6. 《利用Python进行数据分析·第2版》第四章 Numpy基础:数组和矢量计算

    <利用Python进行数据分析·第2版>第四章 Numpy基础:数组和矢量计算 numpy高效处理大数组的数据原因: numpy是在一个连续的内存块中存储数据,独立于其他python内置对 ...

  7. 利用Python学习线性代数 -- 1.1 线性方程组

    利用Python学习线性代数 -- 1.1 线性方程组 本节实现的主要功能函数,在源码文件linear_system中,后续章节将作为基本功能调用. 线性方程 线性方程组由一个或多个线性方程组成,如 ...

  8. 利用python实现平稳时间序列的建模方式

    一.平稳序列建模步骤 假如某个观察值序列通过序列预处理可以判定为平稳非白噪声序列,就可以利用ARMA模型对该序列进行建模.建模的基本步骤如下: (1)求出该观察值序列的样本自相关系数(ACF)和样本偏 ...

  9. 利用Python进行数据分析(12) pandas基础: 数据合并

    pandas 提供了三种主要方法可以对数据进行合并: pandas.merge()方法:数据库风格的合并: pandas.concat()方法:轴向连接,即沿着一条轴将多个对象堆叠到一起: 实例方法c ...

随机推荐

  1. UVA - 10829 L-Gap Substrings (后缀自动机+线段树启发式合并)

    题意:统计一段字符串中形如UVU的子串个数(其中V的长度固定为g). 问题等价于求满足$g+1\leqslant |j-i|\leqslant g+LCP(i,j)$的后缀(i,j)的对数,即$\su ...

  2. 【BZOJ4031】【Luogu P4111】[HEOI2015]小Z的房间

    裸的矩阵树定理.求行列式的时候答案要在中间统计,因为交换两个行会使答案取反. #include <bits/stdc++.h> using namespace std; const int ...

  3. BZOJ1306 [CQOI2009]match循环赛/BZOJ3139 [Hnoi2013]比赛[dfs剪枝+细节题]

    地址 看数据范围很明显的搜索题,暴力dfs是枚举按顺序每一场比赛的胜败情况到底,合法就累计.$O(3^{n*(n-1)/2})$.n到10的时候比较大,考虑剪枝. 本人比较菜所以关键性的剪枝没想出来, ...

  4. 构建的Web应用界面不够好看?快试试最新的Kendo UI R3 2019

    通过70多个可自定义的UI组件,Kendo UI可以创建数据丰富的桌面.平板和移动Web应用程序.通过响应式的布局.强大的数据绑定.跨浏览器兼容性和即时使用的主题,Kendo UI将开发时间加快了50 ...

  5. Attention机制中权重的计算

    Attention mechanism中,给输入序列中对应的每一个Ht分配权重(打分)究竟是如何打分? 输入序列打分,a(s, h) 其中s是输出序列的t-1时刻的隐藏层状态,h是输入的多个状态,

  6. CSS 内边距 padding 属性

    CSS padding 属性定义元素边框与元素内容之间的空白区域. ㈠padding(填充) ⑴当元素的 padding(填充)内边距被清除时,所释放的区域将会受到元素背景颜色的填充. ⑵单独使用 p ...

  7. linux下简单好用的端口映射转发工具rinetd

    linux下简单好用的工具rinetd,实现端口映射/转发/重定向官网地址http://www.boutell.com/rinetd 软件下载wget http://www.boutell.com/r ...

  8. mysql bit 和 tinyint 的区别及使用场景?

    bit类型语法:bit[(M)] : 位字段类型.M表示每个值的位数,范围从1到64.如果M被忽略,默认为1. tinyint是数字类型,存储小数, 一般对应编辑语言里的小字典或枚举类型. 节省空间的 ...

  9. R_Studio(学生成绩)使用cbind()函数对多个学期成绩进行集成

    “Gary1.csv”.“Gary2.csv”.“Gary3.csv”中保存了一个班级学生三个学期的成绩 对三个学期中的成绩数据进行集成并重新计算综合成绩和排名,并按排名顺序排布(学号9位数11130 ...

  10. 利用Zookeeper实现分布式锁

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...