網(wǎng)站首頁 編程語言 正文
scipy.optimize的fsolve,root函數(shù)求解非線性方程
求解如下方程
from scipy.optimize import fsolve, root
import numpy as np
# 定義方程內(nèi)容
def f(x, *arg):
return arg[0] * 2 ** (1 - x) / (1 - x) + (1 - arg[0]) * 1.6 ** (1 - x) / (1 - x) - arg[0] * 3.85 ** (1 - x) / (
1 - x) - (1 - arg[0]) * 0.1 ** (1 - x) / (1 - x)
# 參數(shù)p為一個超參數(shù)
results = [[p * 0.1, fsolve(f, x0=0, args=(p * 0.1))[0]] for p in range(2, 10)]
print(np.array(results), '\n')
results = [[p * 0.1, root(f, x0=0, args=(p * 0.1))['x'][0]] for p in range(2, 10)]
print(np.array(results))
# output results
[[ 0.2 -0.94683705]
[ 0.3 -0.48657472]
[ 0.4 -0.14263228]
[ 0.5 0.14636333]
[ 0.6 0.4114561 ]
[ 0.7 0.67618002]
[ 0.8 0.9705809 ]
[ 0.9 1.3683912 ]]
[[ 0.2 -0.94683705]
[ 0.3 -0.48657472]
[ 0.4 -0.14263228]
[ 0.5 0.14636333]
[ 0.6 0.4114561 ]
[ 0.7 0.67618002]
[ 0.8 0.9705809 ]
[ 0.9 1.3683912 ]]
python求解非線性方程組的幾種方式
問題
對此非線性方程組,根據(jù)方程圖像(如下圖)可知,應(yīng)有4組不同的解。以下嘗試用不同的方法求出該方程組的解。
1. 利用gekko的GEKKO求解
"""利用gekko求解非線性方程組"""
from gekko import GEKKO
m = GEKKO()
x = m.Var(value=0) # 給定初值為0
y = m.Var(value=0) # 給定初值為0
m.Equations([x ** 2 / 4 + y ** 2 == 1,
(x - 0.2) ** 2 - y == 3])
m.solve(disp=False)
x, y = x.value, y.value
print(x, y)
輸出結(jié)果:
[-1.2961338938] [-0.7615833719]
換不同初值計算得到的結(jié)果如下:
[-1.6818042485] [0.54118722964] # ?給定初值為(-2,0)
[1.9760411678] [0.15432222765] # ?給定初值為(2,0)
[1.8018969861] [-0.43392604594] # ?給定初值為(2,-2)
[1.9760412095] [0.15432236862] # ?給定初值為(10,10)
[1.801896954] [-0.4339261545] # ?給定初值為(10,-10)
可知,用這種方法并不能得到方程組的全部解,并且最終得到的解為其解集中與給定的初值“距離”較近的一個。
2. 利用scipy.optimize的fsolve求解
optimize庫中的fsolve函數(shù)可以用來對非線性方程組進行求解。
from scipy.optimize import fsolve
def f(X):
x = X[0]
y = X[1]
return [x ** 2 / 4 + y ** 2 - 1,
(x - 0.2) ** 2 - y - 3]
X0 = [0, 0]
result = fsolve(f, X0)
print(result)
輸出結(jié)果:
[-1.29613389 -0.76158337]
換不同初值計算得到的結(jié)果如下:
[-1.68180425 ?0.54118723] # ?給定初值為(-2,0)
[1.97604116 0.15432219] # ?給定初值為(2,0)
[ 1.80189699 -0.43392605] # ?給定初值為(2,-2)
[1.97604116 0.15432219] # ?給定初值為(10,10)
[ 1.80189699 -0.43392605] # ?給定初值為(10,-10)
可知,用這種方法也不能得到方程組的全部解,并且最終得到的解與給定初值有關(guān)。
3. 利用scipy.optimize的root求解
from scipy.optimize import fsolve, root
def f(X):
x = X[0]
y = X[1]
return [x ** 2 / 4 + y ** 2 - 1,
(x - 0.2) ** 2 - y - 3]
X0 = [10, 10]
result1 = fsolve(f, X0)
result2 = root(f, X0)
print(result2)
輸出結(jié)果:
? ?fjac: array([[-0.2547064 , -0.96701843],
? ? ? ?[ 0.96701843, -0.2547064 ]])
? ? ?fun: array([-3.34943184e-12, ?2.75734990e-12])
?message: 'The solution converged.'
? ? nfev: 22
? ? ?qtf: array([-1.65320424e-10, -2.73193431e-10])
? ? ? ?r: array([-3.70991104, ?0.8956477 , ?0.56891317])
? status: 1
?success: True
? ? ? ?x: array([1.97604116, 0.15432219])
結(jié)果與fsolve函數(shù)得到的結(jié)果相同。
4. 利用scipy.optimize的leastsq求解
from scipy.optimize import leastsq
def f(X):
x = X[0]
y = X[1]
return [x ** 2 / 4 + y ** 2 - 1,
(x - 0.2) ** 2 - y - 3]
X0 = [10, 10]
h = leastsq(f, X0)
print(h)
輸出結(jié)果:
(array([1.97604116, 0.15432219]), 2)
5. 利用sympy的solve和nsolve求解
5.1 利用solve求解所有精確解
from sympy import symbols, Eq, solve, nsolve
x, y = symbols('x y')
eqs = [Eq(x ** 2 / 4 + y ** 2, 1),
Eq((x - 0.2) ** 2 - y, 3)]
print(solve(eqs, [x, y]))
輸出結(jié)果:
[[-1.68180424847377 + 1.56760579250585e-32*I
? 0.541187229573922 - 3.01196919624356e-31*I]
?[-1.29613389377477 + 1.95607066863502e-32*I
? -0.761583371898353 + 3.93313832308616e-31*I]
?[1.80189698634479 - 1.95607066863926e-32*I
? -0.433926045139482 - 8.10475677027422e-31*I]
?[1.97604115590375 - 1.56760579250161e-32*I
? 0.154322187463913 + 7.18358764343162e-31*I]]
可以看出,用這種方法能夠得到方程組的全部解,并且為精確解,缺點是求解時間較長。
5.2 利用nsolve求解數(shù)值解
from sympy import symbols, Eq, nsolve
x, y = symbols('x y')
eqs = [Eq(x ** 2 / 4 + y ** 2, 1),
Eq((x - 0.2) ** 2 - y, 3)]
X0 = [3, 4]
print(nsolve(eqs, [x, y], X0))
輸出結(jié)果:
Matrix([[1.97604115590375], [0.154322187463913]])
nsolve為數(shù)值求解,需要指定一個初始值,初始值會影響最終得到哪一個解(如果有多解的話),而且初始值設(shè)的不好,則可能找不到解。
scipy.optimize.root求解速度快,但只能得到靠近初始值的一個解。對形式簡單、有求根公式的方程,sympy.solve能夠得到所有嚴格解,但當(dāng)方程組變量較多時,它求起來會很慢。而且對于不存在求根公式的復(fù)雜方程,sympy.solve無法求解。
總結(jié)
原文鏈接:https://blog.csdn.net/HelloWorld1108/article/details/104983983
相關(guān)推薦
- 2023-01-21 python中filter函數(shù)的用法示例代碼_python
- 2022-07-08 Qt5?串口類QSerialPort的實現(xiàn)_C 語言
- 2022-05-12 Android10 分享微信提示獲取資源失敗
- 2022-05-26 pandas進行數(shù)據(jù)輸入和輸出的方法詳解_python
- 2023-08-15 vite打包報錯 Rollup failed to resolve
- 2022-09-27 OpenCV中findContours函數(shù)參數(shù)詳解_C 語言
- 2022-05-03 windows?server?2019開啟iis服務(wù)器+tp5.1的完美配置運行流程_win服務(wù)器
- 2022-10-01 Python使用Asyncio進行web編程方法詳解_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支