利用python求非線性方程


最近在做的東西中有一件任務,相當於一個函數已知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均發生錯誤,貌似是該函數無法解決非線性方程。
該包具體怎么用來實現求解非線性方程還沒深究,也許以后會補上。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM