最近在做的东西中有一件任务,相当于一个函数已知y来求x,网上找了各种办法最终得以实现。在此说明方法,并记录一些坑。
要求的函数比如:log(x) - log(1-x) + 2.2 * (1 -2x) 最好用的方法,利用Scipy.optimize中的fsolve函数。在该方法中,我们可以调用scipy.optimize.fsolve来求解非线性方程(组),具体方法如下:
from scipy.optimize import fsolveimport 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赋值给xwhile 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求非线性方程全部内容,希望文章能够帮你解决利用python求非线性方程所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)