python第三方库解方程

非线性方程求解

方程到代码

简单一个试一下,方程

\[ y=sin(x) + x \]

如果 \(x=\frac{\pi}{2}, y = 1+\frac{\pi}{2}\),写出代码如下

1
2
3
4
5
6
7
8
9
10
11
12
import math


def f(x):
y = math.sin(x) + x
return y


print(f(math.pi/2))

# 输出
# 2.5707963267948966

库函数转换

假设我们知道 \(y = 1+\frac{\pi}{2}\),求解x,这里我们使用 sympy 库。注意我们需要把 math 这些库的函数(比如 math.sinmath.pi )替换为 sympy

1
2
3
4
5
6
7
8
9
10
11
12
13
import math
import sympy as sp


def f(x):
y = sp.sin(x) + x
return y


print(f(sp.pi/2))

# 输出
# 1 + pi/2

使用 sympy 求解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import sympy as sp


def f(x):
y = sp.sin(x) + x
return y


x = sp.symbols('x')
y = 1 + sp.pi / 2
eqs = sp.Eq(f(x), y)
solution = sp.solve(eqs, x)

print(solution)

很不靠谱,求解不出来

1
No algorithms are implemented to solve equation x + sin(x) - pi/2 - 1

sympy 结合 scipy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import sympy as sp
from scipy.optimize import fsolve


def f(x):
y = sp.sin(x) + x
return y


x = sp.symbols('x')
y = 1 + sp.pi / 2

# 初始值,猜测结果,有时候这个很重要
initial_value = 0

func = sp.lambdify(x, f(x) - y)
solution = fsolve(func, initial_value)

print(solution)

复杂方程求解

\[ b(v)=\sum_{m=0}^4C_4^mv^m(1-v)^{(4-m)}g(h_i, \beta) \]

其中变量是 \(v\)\(\omega_i\) 是未知数,\(tanh\) 是三角函数,其中 \(g(h_i, \beta)\) 如下

其中

\[ g(h_i,\beta)=\frac{1}{2}(1+\frac{tanh(\beta h_i)}{tanh(\beta)}) \]

其中 \(h_i\) 如下

\[ h_i=\frac{\omega_im-(4-m)}{\omega_im+(4-m)} \]

如果我们知道 \(v=\frac{1}{2}\)\(b(\frac{1}{2})=0.07\),我们可以求解未知参数 \(\omega_i\) ,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import sympy as sp
from scipy.optimize import fsolve


def v2bi(v, w_z, beta=2):
Cs = [1, 4, 6, 4, 1]
b_i = 0
for m in range(5):
h_i = (w_z * m - (4 - m)) / (w_z * m + (4 - m))
g_i = (1 + sp.tanh(beta * h_i) / sp.tanh(beta)) / 2
b_i += Cs[m] * (v**m) * ((1 - v)**(4 - m)) * g_i
return b_i


initial_value = 0

w_i = sp.symbols('w_i')
result = 0.07

func = sp.lambdify(w_i, v2bi(1 / 2, w_i) - result)
solution = fsolve(func, initial_value)

print(solution)

# 输出
# [0.03433438]

本文作者:yuhldr
本文地址: https://yuhldr.github.io/posts/6261.html
版权声明:转载请注明出处!