【数值计算方法】非线性方程求根-数值实验

news2024/11/24 17:54:33

img

第一题

newton method

非线性方程组的向量函数为:

F ( x , y ) = ( f 1 ( x , y ) f 2 ( x , y ) ) = { ( x − 2 ) 2 + ( y − 3 + 2 x ) 2 − 5 = 0 , 2 ( x − 3 ) 2 + ( y / 3 ) 2 − 4 = 0. F(x,y)=\begin{pmatrix} f_1(x,y)\\f_2(x,y)\end{pmatrix}=\left.\left\{\begin{array}{l}(x-2)^2+(y-3+2x)^2-5=0,\\2(x-3)^2+(y/3)^2-4=0.\end{array}\right.\right. F(x,y)=(f1(x,y)f2(x,y))={(x2)2+(y3+2x)25=0,2(x3)2+(y/3)24=0.

迭代格式为:

x k + 1 = x k − [ F ( x k ) ] − 1 F ( x k ) x^{k+1}=x^k-[F(x^k)]^{-1}F(x^k) xk+1=xk[F(xk)]1F(xk)

其中 [ F ′ ( x , y ) ] [F'(x,y)] [F(x,y)] F ( x , y ) F(x,y) F(x,y)的Jacobian矩阵:

[ F ′ ( x ) ] = [ ∂ f 1 ∂ x ∂ f 1 ∂ y ∂ f 2 ∂ x ∂ f 2 ∂ y ] [F'(x)]=\begin{bmatrix}\frac{\partial f_1}{\partial x} & \frac{\partial f_1}{\partial y}\\\frac{\partial f_2}{\partial x} & \frac{\partial f_2}{\partial y}\end{bmatrix} [F(x)]=[xf1xf2yf1yf2]

from formu_lib import *
import numpy as np
from matplotlib import pyplot as plt

def F(x:np.ndarray)->np.ndarray:
    x,y=x[0],x[1]
    
    f1=(x-2)**2+(y-3+2*x)**2-5
    f2=2*(x-3)**2+(y/3.0)**2-4
    return np.array([f1,f2])

def DF(x:np.ndarray)->np.ndarray:
    x,y=x[0],x[1]
    f11=2*(x-2)+4*(y-3+2*x)
    f12=4*(y-3+2*x)
    f21=4*(x-3)
    f22=(2*y)/9.0
    return np.array([[f11,f12],
                    [f21,f22]])

x0=np.array([0,0])
tol=1e-10
maxiter=100

x,res=NonlinearEquationsNewtonMethod(F,DF,x0,tol,maxiter)
plt.plot(list(range(len(res))),res,label='residual-norm',marker='o')
plt.xlabel('iteration')
plt.ylabel('residual-norm(F(x))')
plt.legend()
plt.title('residual-norm VS iteration')
plt.show()

print(f"results:")
print(f"root:{x},residual-norm:{res[-1]}")

img

  • results:

root:[ 1.7362259 -2.69290744],residual-norm:8.749090341098054e-11

quasi-newton method

拟牛顿法的迭代格式为:

F ( k + 1 ) − F ( k ) = B ( x ( k + 1 ) − x ( k ) ) F^{(k+1)}-F^{(k)}=B(x^{(k+1)}-x^{(k)}) F(k+1)F(k)=B(x(k+1)x(k))

取单位矩阵为B0矩阵,使用秩一修正 (Rank 1 Update) 公式修正B矩阵:

B k + 1 = B k + ( y ( k ) − B k s ( k ) ) s ( k ) T s ( k ) T s ( k ) B_{k+1}=B_k+\frac{(\boldsymbol{y}^{(k)}-\boldsymbol{B}_ks^{(k)}){\boldsymbol{s}^{(k)}}^\mathrm{T}}{{s^{(k)}}^Ts^{(k)}} Bk+1=Bk+s(k)Ts(k)(y(k)Bks(k))s(k)T

from formu_lib import *
import numpy as np
from matplotlib import pyplot as plt
from numpy.linalg import inv,norm

def F(xs:np.ndarray)->np.ndarray:
    x,y=xs[0],xs[1]
    
    f1=(x-2)**2+(y-3+2*x)**2-5
    f2=2*(x-3)**2+(y/3.0)**2-4
    return np.array([f1,f2])

x0=np.array([1,1])
B0=np.eye(2)
tol=1e-10
maxiter=100

x,res=NonliearEquationsQuasi_NewtonMethod(F,B0,x0,tol,maxiter)

# 绘图
plt.plot(list(range(len(res))),res,label=f' quasi-newton method Iter,num:{len(res)}',marker='o')
plt.xlabel('iteration')
plt.ylabel('residual-norm(F(x))')
plt.legend()
plt.title('residual-norm VS iteration')
plt.show()

print(f"results:")
print(f"+ quasi-newton method Iter,num:{len(res)},root:{x},residual-norm:{res[-1]}")

img

  • results of quasi-newton method Iter:
    • num:21
    • root:[ 4.02873354 -4.1171266 ]
    • residual-norm:1.855071568790407e-12

第二题

可以使用牛顿法,割线法,二分法,不动点迭代法计算非线性方程组在[-10,10]的根:

∑ k = 1 10 k e − cos ⁡ k x sin ⁡ k x = 2. \sum_{k=1}^{10}k\mathrm{e}^{-\cos kx}\sin kx=2. k=110kecoskxsinkx=2.

原函数的图像为:

原函数图像python code
from formu_lib import *
import numpy as np
from matplotlib import pyplot as plt

def f(x:float)->float:
    def ff(x,k):
        return k*np.exp(-np.cos(k*x))*np.sin(k*x)
    return sum([ff(x,k) for k in range(1,11)])-2

a,b=-10,10
num=1000
x=np.linspace(a,b,num)
y=[f(i) for i in x]

plt.plot(x,y,label='f(x)')
plt.plot([a,b],[0,0],label='f(x)=0')
plt.xlabel('x')
plt.ylabel('f(x)')
plt.legend()
plt.title('f(x) VS x')
plt.show()

img

使用复合二分法求根

roots=ComBSMethod(f,a,b,2000,1e-10)
print(f"results:{roots}")
plt.scatter(roots,[f(root)for root in roots],label='f(x)=0 roots',marker='o')

img

结果:

ComBSMethod time:0.369394 s

复合二分法求根结果

root_1 , val_1 = -9.9674243606 , 误差 = -3.64980e-09
root_2 , val_2 = -9.7797174668 , 误差 = -6.61337e-09
root_3 , val_3 = -9.6149032646 , 误差 = -1.38758e-09
root_4 , val_4 = -9.4302274624 , 误差 = -7.99506e-09
root_5 , val_5 = -9.2207822340 , 误差 = -5.04254e-09
root_6 , val_6 = -9.0871043562 , 误差 = 6.59284e-09
root_7 , val_7 = -8.8530192104 , 误差 = 1.21289e-09
root_8 , val_8 = -8.7125086779 , 误差 = -3.74143e-11
root_9 , val_9 = -8.6442340327 , 误差 = -2.62465e-09
root_10 , val_10 = -8.5133652799 , 误差 = 4.73630e-09
root_11 , val_11 = -8.2899925123 , 误差 = -1.15093e-09
root_12 , val_12 = -7.8981572476 , 误差 = -2.71837e-09
root_13 , val_13 = -7.6307012374 , 误差 = 1.03455e-09
root_14 , val_14 = -7.3115311582 , 误差 = 1.90418e-09
root_15 , val_15 = -7.0320102647 , 误差 = -3.08314e-09
root_16 , val_16 = -6.6955392638 , 误差 = 1.15621e-09
root_17 , val_17 = -6.2691253474 , 误差 = 2.07994e-09
root_18 , val_18 = -5.8813837698 , 误差 = 1.17033e-08
root_19 , val_19 = -5.5099115066 , 误差 = 4.09161e-09
root_20 , val_20 = -5.2816152127 , 误差 = -1.69667e-09
root_21 , val_21 = -4.8929026655 , 误差 = -2.34091e-10
root_22 , val_22 = -4.6958911892 , 误差 = -3.00448e-09
root_23 , val_23 = -4.2373378929 , 误差 = -2.08822e-09
root_24 , val_24 = -4.0708334564 , 误差 = 4.54090e-09
root_25 , val_25 = -3.6842390533 , 误差 = 4.17905e-09
root_26 , val_26 = -3.4965321596 , 误差 = -2.23404e-09
root_27 , val_27 = -3.3317179574 , 误差 = -7.17032e-09
root_28 , val_28 = -3.1470421552 , 误差 = -8.36770e-10
root_29 , val_29 = -2.9375969268 , 误差 = 1.02456e-08
root_30 , val_30 = -2.8039190489 , 误差 = -6.32259e-09
root_31 , val_31 = -2.5698339033 , 误差 = -1.27755e-09
root_32 , val_32 = -2.4293233707 , 误差 = 1.34728e-09
root_33 , val_33 = -2.3610487255 , 误差 = 1.62072e-09
root_34 , val_34 = -2.2301799727 , 误差 = -6.62781e-09
root_35 , val_35 = -2.0068072050 , 误差 = 1.93580e-09
root_36 , val_36 = -1.6149719405 , 误差 = -5.79220e-10
root_37 , val_37 = -1.3475159302 , 误差 = -4.51056e-10
root_38 , val_38 = -1.0283458510 , 误差 = 4.41240e-09
root_39 , val_39 = -0.7488249574 , 误差 = 5.23588e-09
root_40 , val_40 = -0.4123539567 , 误差 = 8.09918e-09
root_41 , val_41 = 0.0140599598 , 误差 = -7.27386e-10
root_42 , val_42 = 0.4018015374 , 误差 = -1.04345e-08
root_43 , val_43 = 0.7732738006 , 误差 = 6.67258e-10
root_44 , val_44 = 1.0015700944 , 误差 = 1.62301e-09
root_45 , val_45 = 1.3902826416 , 误差 = -2.43751e-09
root_46 , val_46 = 1.5872941179 , 误差 = 3.89356e-10
root_47 , val_47 = 2.0458474142 , 误差 = -4.93489e-09
root_48 , val_48 = 2.2123518508 , 误差 = -8.42840e-09
root_49 , val_49 = 2.5989462538 , 误差 = 1.39076e-09
root_50 , val_50 = 2.7866531475 , 误差 = 2.14411e-09
root_51 , val_51 = 2.9514673498 , 误差 = 9.06527e-09
root_52 , val_52 = 3.1361431519 , 误差 = 6.32116e-09
root_53 , val_53 = 3.3455883804 , 误差 = 4.80044e-09
root_54 , val_54 = 3.4792662582 , 误差 = -1.72254e-09
root_55 , val_55 = 3.7133514039 , 误差 = -3.76804e-09
root_56 , val_56 = 3.8538619365 , 误差 = 9.58726e-11
root_57 , val_57 = 3.9221365817 , 误差 = 1.08535e-10
root_58 , val_58 = 4.0530053345 , 误差 = -2.58038e-09
root_59 , val_59 = 4.2763781021 , 误差 = 8.36526e-10
root_60 , val_60 = 4.6682133667 , 误差 = 1.56013e-09
root_61 , val_61 = 4.9356693770 , 误差 = -1.93659e-09
root_62 , val_62 = 5.2548394562 , 误差 = -2.63018e-09
root_63 , val_63 = 5.5343603497 , 误差 = 2.27312e-09
root_64 , val_64 = 5.8708313506 , 误差 = -1.13952e-08
root_65 , val_65 = 6.2972452669 , 误差 = -3.53509e-09
root_66 , val_66 = 6.6849868445 , 误差 = -2.54973e-09
root_67 , val_67 = 7.0564591077 , 误差 = -2.75658e-09
root_68 , val_68 = 7.2847554016 , 误差 = 4.94253e-09
root_69 , val_69 = 7.6734679488 , 误差 = 3.74978e-09
root_70 , val_70 = 7.8704794251 , 误差 = 3.78277e-09
root_71 , val_71 = 8.3290327215 , 误差 = 3.05804e-09
root_72 , val_72 = 8.4955371580 , 误差 = -3.80944e-09
root_73 , val_73 = 8.8821315610 , 误差 = -1.39815e-09
root_74 , val_74 = 9.0698384547 , 误差 = 6.52338e-09
root_75 , val_75 = 9.2346526570 , 误差 = 3.28313e-09
root_76 , val_76 = 9.4193284591 , 误差 = 1.34788e-08
root_77 , val_77 = 9.6287736875 , 误差 = -6.43427e-10
root_78 , val_78 = 9.7624515654 , 误差 = 2.87701e-09
root_79 , val_79 = 9.9965367111 , 误差 = 3.22517e-09

牛顿下山法

# 牛顿法
st=time()
roots=[]
for i in range(1,num):
    a0,b0=x[i-1],x[i]
    if f(a0)*f(b0)>0:
        continue
    r=NewtonMethod_DownHill(f,a0,df,tol)
    roots.append(r)
et=time()
print(f"NewtonMethod_DownHill time:{(et-st):.6f} s")
for ind,root in enumerate(roots,1):
    print(f"root_{ind} = {root:.10f} , 误差 = {f(root):.5e}")
plt.scatter(roots,[f(root)for root in roots],label='f(x)=0 roots',marker='o',color='red')

img

结果:

NewtonMethod time:0.142408 s

计算结果

root_1 = -9.9674243605 , 误差 = 6.21725e-15
root_2 = -9.7797174668 , 误差 = -9.05942e-14
root_3 = -9.6149032646 , 误差 = -1.77636e-13
root_4 = -9.4302274624 , 误差 = -1.25011e-13
root_5 = -9.2207822340 , 误差 = -1.19016e-13
root_6 = -9.0871043561 , 误差 = -2.70894e-13
root_7 = -8.8530192104 , 误差 = -1.55964e-12
root_8 = -8.7125086779 , 误差 = 2.14939e-13
root_9 = -8.6442340327 , 误差 = 4.70735e-14
root_10 = -8.5133652799 , 误差 = -7.62705e-11
root_11 = -8.2899925123 , 误差 = -2.37144e-13
root_12 = -7.8981572477 , 误差 = 3.19744e-14
root_13 = -7.6307012374 , 误差 = -1.92610e-11
root_14 = -7.3115311582 , 误差 = -7.97389e-11
root_15 = -7.0320102646 , 误差 = -2.93099e-13
root_16 = -6.6955392638 , 误差 = -1.15463e-13
root_17 = -6.2691253474 , 误差 = -2.15383e-14
root_18 = -5.8813837698 , 误差 = 1.59872e-13
root_19 = -5.5099115066 , 误差 = 1.20792e-13
root_20 = -5.2816152128 , 误差 = 1.24345e-14
root_21 = -4.8929026655 , 误差 = 4.08562e-14
root_22 = -4.6958911893 , 误差 = 1.19016e-13
root_23 = -4.2373378929 , 误差 = 2.39808e-13
root_24 = -4.0708334564 , 误差 = -6.79456e-14
root_25 = -3.6842390533 , 误差 = 3.95239e-14
root_26 = -3.4965321596 , 误差 = -2.22045e-14
root_27 = -3.3317179574 , 误差 = 1.95399e-14
root_28 = -3.1470421552 , 误差 = -3.53051e-14
root_29 = -2.9375969268 , 误差 = 6.75016e-14
root_30 = -2.8039190490 , 误差 = -6.92779e-14
root_31 = -2.5698339033 , 误差 = -3.06422e-14
root_32 = -2.4293233707 , 误差 = 1.48903e-12
root_33 = -2.3610487255 , 误差 = 1.94333e-12
root_34 = -2.2301799727 , 误差 = -4.79616e-14
root_35 = -2.0068072051 , 误差 = 1.50990e-14
root_36 = -1.6149719405 , 误差 = -1.77636e-15
root_37 = -1.3475159302 , 误差 = -1.60760e-13
root_38 = -1.0283458510 , 误差 = -1.17240e-13
root_39 = -0.7488249575 , 误差 = -4.44089e-15
root_40 = -0.4123539566 , 误差 = -4.93827e-13
root_41 = 0.0140599598 , 误差 = 0.00000e+00
root_42 = 0.4018015374 , 误差 = 3.55271e-15
root_43 = 0.7732738006 , 误差 = 5.32907e-15
root_44 = 1.0015700944 , 误差 = -1.06581e-14
root_45 = 1.3902826416 , 误差 = 9.76996e-15
root_46 = 1.5872941179 , 误差 = -1.33227e-14
root_47 = 2.0458474143 , 误差 = -1.59872e-14
root_48 = 2.2123518508 , 误差 = 2.04281e-13
root_49 = 2.5989462538 , 误差 = 1.68754e-14
root_50 = 2.7866531475 , 误差 = 3.37508e-14
root_51 = 2.9514673498 , 误差 = -4.97380e-14
root_52 = 3.1361431519 , 误差 = 5.41789e-14
root_53 = 3.3455883803 , 误差 = -7.27720e-11
root_54 = 3.4792662582 , 误差 = -1.42109e-14
root_55 = 3.7133514039 , 误差 = -2.66454e-15
root_56 = 3.8538619365 , 误差 = -8.10463e-14
root_57 = 3.9221365817 , 误差 = -2.84217e-14
root_58 = 4.0530053345 , 误差 = -5.55023e-12
root_59 = 4.2763781021 , 误差 = -2.63496e-11
root_60 = 4.6682133667 , 误差 = -2.84217e-14
root_61 = 4.9356693770 , 误差 = -1.58984e-13
root_62 = 5.2548394562 , 误差 = -3.64153e-13
root_63 = 5.5343603497 , 误差 = -5.32907e-15
root_64 = 5.8708313505 , 误差 = 6.39488e-14
root_65 = 6.2972452669 , 误差 = 8.13420e-11
root_66 = 6.6849868445 , 误差 = -7.10543e-15
root_67 = 7.0564591078 , 误差 = 9.23706e-14
root_68 = 7.2847554016 , 误差 = 1.76659e-11
root_69 = 7.6734679488 , 误差 = -4.08562e-14
root_70 = 7.8704794251 , 误差 = 2.66454e-15
root_71 = 8.3290327215 , 误差 = -6.03961e-14
root_72 = 8.4955371580 , 误差 = 3.74487e-11
root_73 = 8.8821315610 , 误差 = -3.64153e-14
root_74 = 9.0698384547 , 误差 = 7.63833e-14
root_75 = 9.2346526569 , 误差 = 5.47189e-11
root_76 = 9.4193284591 , 误差 = 1.05693e-13
root_77 = 9.6287736875 , 误差 = -1.36193e-11
root_78 = 9.7624515654 , 误差 = -1.19904e-13
root_79 = 9.9965367111 , 误差 = -5.15143e-14

割线法求根

# 割线法
st=time()
roots=[]
for i in range(1,num):
    a0,b0=x[i-1],x[i]
    if f(a0)*f(b0)>0:
        continue
    r=SecantMethod2Ps(f,a0,b0,tol)
    roots.append(r)
et=time()
print(f"SecantMethod2Ps time:{(et-st):.6f} s")
for ind,root in enumerate(roots,1):
    print(f"root_{ind} = {root:.10f} , 误差 = {f(root):.5e}")
plt.scatter(roots,[f(root)for root in roots],label='f(x)=0 roots',marker='o',color='red')

img

结果:

SecantMethod2Ps time:0.102962 s

展开

root_1 = -9.9674243605 , 误差 = -9.84635e-12
root_2 = -9.7797174668 , 误差 = 2.42473e-13
root_3 = -9.6149032646 , 误差 = -1.77636e-13
root_4 = -9.4302274624 , 误差 = -1.25011e-13
root_5 = -9.2207822340 , 误差 = -1.19016e-13
root_6 = -9.0871043561 , 误差 = 1.06581e-14
root_7 = -8.8530192104 , 误差 = -4.79616e-14
root_8 = -8.7125086779 , 误差 = 1.66800e-12
root_9 = -8.6442340327 , 误差 = -4.66294e-13
root_10 = -8.5133652799 , 误差 = -2.06057e-13
root_11 = -8.2899925123 , 误差 = 1.32339e-13
root_12 = -7.8981572477 , 误差 = 3.19744e-14
root_13 = -7.6307012374 , 误差 = 1.27010e-13
root_14 = -7.3115311582 , 误差 = 3.01981e-14
root_15 = -7.0320102646 , 误差 = 9.76117e-11
root_16 = -6.6955392638 , 误差 = -1.15463e-13
root_17 = -6.2691253474 , 误差 = -2.15383e-14
root_18 = -5.8813837698 , 误差 = 1.59872e-13
root_19 = -5.5099115066 , 误差 = -4.85390e-12
root_20 = -5.2816152128 , 误差 = -7.78790e-11
root_21 = -4.8929026655 , 误差 = -1.41718e-11
root_22 = -4.6958911893 , 误差 = -1.33227e-13
root_23 = -4.2373378929 , 误差 = -2.66454e-14
root_24 = -4.0708334564 , 误差 = -2.55929e-12
root_25 = -3.6842390533 , 误差 = -2.78444e-13
root_26 = -3.4965321596 , 误差 = 1.71951e-12
root_27 = -3.3317179574 , 误差 = 8.82672e-12
root_28 = -3.1470421552 , 误差 = -3.53051e-14
root_29 = -2.9375969268 , 误差 = 7.23333e-12
root_30 = -2.8039190490 , 误差 = -6.92779e-14
root_31 = -2.5698339033 , 误差 = 7.99361e-15
root_32 = -2.4293233707 , 误差 = 7.14540e-13
root_33 = -2.3610487255 , 误差 = -2.20712e-12
root_34 = -2.2301799727 , 误差 = -4.79616e-14
root_35 = -2.0068072051 , 误差 = 2.57572e-13
root_36 = -1.6149719405 , 误差 = 1.22569e-13
root_37 = -1.3475159302 , 误差 = -1.59872e-14
root_38 = -1.0283458510 , 误差 = -1.77636e-15
root_39 = -0.7488249575 , 误差 = 1.52420e-11
root_40 = -0.4123539566 , 误差 = 3.97655e-11
root_41 = 0.0140599598 , 误差 = -1.95399e-14
root_42 = 0.4018015374 , 误差 = 3.55271e-15
root_43 = 0.7732738006 , 误差 = -8.86402e-13
root_44 = 1.0015700944 , 误差 = -1.06581e-14
root_45 = 1.3902826416 , 误差 = -4.44089e-14
root_46 = 1.5872941179 , 误差 = -1.39124e-11
root_47 = 2.0458474143 , 误差 = -1.59872e-14
root_48 = 2.2123518508 , 误差 = 1.46549e-14
root_49 = 2.5989462538 , 误差 = -1.77423e-11
root_50 = 2.7866531475 , 误差 = 1.83187e-11
root_51 = 2.9514673498 , 误差 = -4.97380e-14
root_52 = 3.1361431519 , 误差 = 7.53486e-12
root_53 = 3.3455883803 , 误差 = 7.95701e-11
root_54 = 3.4792662582 , 误差 = -1.42109e-14
root_55 = 3.7133514039 , 误差 = -2.66454e-15
root_56 = 3.8538619365 , 误差 = -8.10463e-14
root_57 = 3.9221365817 , 误差 = -2.15294e-12
root_58 = 4.0530053345 , 误差 = 1.63514e-12
root_59 = 4.2763781021 , 误差 = 8.88178e-16
root_60 = 4.6682133667 , 误差 = 4.58478e-12
root_61 = 4.9356693770 , 误差 = 3.82272e-12
root_62 = 5.2548394562 , 误差 = -1.77636e-15
root_63 = 5.5343603497 , 误差 = -5.32907e-15
root_64 = 5.8708313505 , 误差 = 6.39488e-14
root_65 = 6.2972452669 , 误差 = 3.10862e-14
root_66 = 6.6849868445 , 误差 = -7.10543e-15
root_67 = 7.0564591078 , 误差 = 9.23706e-14
root_68 = 7.2847554016 , 误差 = 9.23706e-14
root_69 = 7.6734679488 , 误差 = -1.04192e-11
root_70 = 7.8704794251 , 误差 = 2.66454e-15
root_71 = 8.3290327215 , 误差 = -6.03961e-14
root_72 = 8.4955371580 , 误差 = -3.67466e-11
root_73 = 8.8821315610 , 误差 = -4.97105e-11
root_74 = 9.0698384547 , 误差 = 3.88916e-11
root_75 = 9.2346526569 , 误差 = 1.24345e-13
root_76 = 9.4193284591 , 误差 = -5.30687e-13
root_77 = 9.6287736875 , 误差 = 1.22569e-13
root_78 = 9.7624515654 , 误差 = 2.06057e-13
root_79 = 9.9965367111 , 误差 = 3.23874e-12

总结

计算耗时: 二分法>牛顿下山法>割线法

第三题


# 数值实验第三题
from formu_lib import *
import numpy as np
from matplotlib import pyplot as plt

def fa(x:float)->float:
    return x**5-3*x-10

def dfa(x:float)->float:
    return 5*x**4-3

def fb(x:float)->float:
    return np.sin(10*x)+2*np.cos(x)-x-3

def dfb(x:float)->float:
    return 10*np.cos(10*x)-2*np.sin(x)-1

def fc(x:float)->float:
    return x+np.arctan(x)-3

def dfc(x:float)->float:
    return 1+1/(x**2+1)

def fd(x:float)->float:
    return (x+2)*np.log(x*x+x+1)+1 

def dfd(x:float)->float:
    return np.log(x*x+x+1)+((2*x+1)*(x+2))/(x*x+x+1)

# initialize
a,b=-5,5
n=1000
tol=1e-10
plt.plot([a,b],[0,0],'r--',label='f(x)=0')
# 要计算的函数
f=fd
df=dfd

# 绘制原函数
x=np.linspace(a,b,n)
plt.plot(x,[f(i) for i in x],label=f'f={f.__name__}')
plt.xlabel('x')
plt.ylabel('f(x)')
plt.legend()
plt.title('f(x) VS x')
plt.show()

from time import time
st1=time()
rootEF=ComFormulaSolveNonlinearEquation(f,a,b,n,tol,'EF')
et1=time()
print(f"EF time:{(et1-st1):.6e} s ")
for ind,i in enumerate(rootEF):
    print(f"root-{ind} : {i:.6e}")

st2=time()
rootND=ComFormulaSolveNonlinearEquation(f,a,b,n,tol,'ND',df)
et2=time()
print(f"ND time:{(et2-st2):.6e} s ")
for ind,i in enumerate(rootND):
    print(f"root-{ind} : {i:.6e}")
    
st3=time()
rootGX=ComFormulaSolveNonlinearEquation(f,a,b,n,tol,'GX')
et3=time()
print(f"GX time:{(et3-st3):.6e} s ")
for ind,i in enumerate(rootGX):
    print(f"root-{ind} : {i:.6e}")
    
st4=time()
rootNDXS=ComFormulaSolveNonlinearEquation(f,a,b,n,tol,'NDXS',df)
et4=time()
print(f"NDXS time:{(et4-st4):.6e} s ")
for ind,i in enumerate(rootNDXS):
    print(f"root-{ind} : {i:.6e}")

(a)

img

输出:

EF time:1.034021e-03 s , root:1.722600e+00
ND time:3.840923e-04 s , root:1.722600e+00
GX time:0.000000e+00 s , root:1.722600e+00
NDXS time:0.000000e+00 s , root:1.722600e+00

(b)

原函数:

img

img

输出:

EF time:1.297569e-02 s
root-0 : -4.091325e+00
root-1 : -1.106281e+00
root-2 : -1.077267e+00
root-3 : -5.443070e-01
root-4 : -4.001593e-01

ND time:9.279728e-03 s
root-0 : -4.091325e+00
root-1 : -1.106281e+00
root-2 : -1.077267e+00
root-3 : -5.443070e-01
root-4 : -4.001593e-01

GX time:7.452250e-03 s
root-0 : -4.091325e+00
root-1 : -1.106281e+00
root-2 : -1.077267e+00
root-3 : -5.443070e-01
root-4 : -4.001593e-01

NDXS time:6.772041e-03 s
root-0 : -4.091325e+00
root-1 : -1.106281e+00
root-2 : -1.077267e+00
root-3 : -5.443070e-01
root-4 : -4.001593e-01

©

原函数:

img

img

输出:

EF time:8.013487e-03 s
root-0 : 1.911252e+00

ND time:5.990267e-03 s
root-0 : 1.911252e+00

GX time:7.455111e-03 s
root-0 : 1.911252e+00

NDXS time:6.035566e-03 s
root-0 : 1.911252e+00

(d)

原函数:

img

img

输出:

EF time:6.999493e-03 s
root-0 : -2.607232e+00
ND time:7.000446e-03 s
root-0 : -2.607232e+00
GX time:5.002499e-03 s
root-0 : -2.607232e+00
NDXS time:7.050514e-03 s
root-0 : -2.607232e+00

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2036160.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 基本指令讲解

linux 基本指令 clear 清屏 Alt Enter 全屏/退出全屏 pwd 显示当前用户所处路径 cd 改变目录 cd /root/mikecd … 返回上级目录cd - 返回最近所处的路径cd ~ 直接返回当前用户自己的家目 roor 中:/root普通用户中:/home/mike mkdir 创建一个文件夹(d) …

高可用集群keepalived详解(基础部署与企业应用示例)

目录 一、高可用集群简介 1.1 集群的类型 1.2系统的可用性 1.3 如何实现高可用 1.4 VRRP(虚拟路由冗余协议)---解决静态网关单点风险 1.4.1 VRRP相关术语 1.4.2 VRRP相关技术 二、Keepalived 部署 2.1 keepalived 架构 2.2 环境准备 三、keepalived基本配置 3.1 全局…

UE开发中的设计模式(三) —— 对象池模式

在FPS游戏中,射击会生成子弹,在命中敌人后子弹会被销毁,那么会导致子弹对象频繁地创建和销毁,会造成运行效率降低且会产生内存碎片问题,而对象池模式可以很好地解决这个问题。 文章目录 问题提出概述问题解决总结 问题…

【C语言】常用函数汇总表

目录 1. C语言常用函数汇总表&#xff08;概念功能&#xff09;1.1 输入/输出函数&#xff08;<stdio.h>&#xff09;1.2 字符串操作函数&#xff08;<string.h>&#xff09;1.3 内存管理函数&#xff08;<stdlib.h>&#xff09;1.4 数学函数&#xff08;<…

快排/堆排/归并/冒泡/

常见的内排序算法 插入排序 直接插入排序 原理&#xff1a;相当于扑克牌变成有序&#xff0c;先拿第一张&#xff0c;把他调节成有序&#xff0c;再拿第二张&#xff0c;与第一张相比找到第二张的位置&#xff0c;再继续拿第三张&#xff0c;以此类推。 void InsertSort(in…

Jupyter Notebook修改文件的默认保存路径

1&#xff0c;安装好后Jupyter Notebook的默认保存路径为用户文件夹&#xff0c; 在jupyter中新建的文件会保存在这里 2&#xff0c;新建一个自己想用来存放Jupyter文件的文件夹 3&#xff0c;找到jupyter的config文件&#xff0c;jupyter_notebook_config.py 4&#xff0c;…

俞敏洪,真窝囊?

文&#xff5c;琥珀食酒社 作者 | 璇子 大家都被俞敏洪骗了 当年《中国合伙人》一播出 俞敏洪竟抱怨黄晓明说&#xff1a; “你把我演得太窝囊&#xff01;” 那俞敏洪真的不窝囊吗&#xff1f; 他培养出董宇辉 让他赚了近6亿 结果人没留住、公司也送了人 还要被丈母娘…

NextJS 服务器端代码调试

NextJS 中如何调试服务器端代码&#xff0c;根据官方文档设置 Chrome 调试&#xff0c;这里有个坑&#xff0c;来看下面配置&#xff1a; {"scripts": {"dev": "NODE_OPTIONS--inspect next dev"} }启动成功&#xff0c;有两个端口 9229、9230&…

企业文件加密软件有哪些,2024常用十款文件加密软件推荐

在当今数字化办公环境中&#xff0c;企业文件加密软件是保护商业秘密和敏感数据的关键工具。随着网络攻击和数据泄露事件的增多&#xff0c;选择一款能够提供强有力保护的文件加密软件显得尤为重要。2024年&#xff0c;市场上出现了一系列新的文件加密解决方案&#xff0c;它们…

如何选择企业差旅管理平台?差旅降本指南

企业差旅管理的能力已成为企业运营成本管理的重要一环。如何选择一个高效且可以定制化的差旅管理平台,已成为众多企业降本增效的焦点。本文将结合当前差旅管理的最新理论和技术趋势,来探讨企业如何选择适合自己的差旅管理平台。 第一,选择差旅管理平台的关键因素 1. 差旅预订便…

二级域名分发系统

介绍&#xff1a; 一个不错的二级域名租用系统代码。 二级域名分发系统的用法&#xff1a;弄几个已经备案的域名分发一下赚点小钱&#xff0c;自己也用了&#xff0c;别人也用了&#xff0c;然后也回本了&#xff0c;搞得好还可以挣点小钱。 不懂的就不要下载了。 代码下载…

全网最最最详细的haproxy详解!!!

1 什么是负载均衡 负载均衡&#xff08;Load Balancing&#xff09;是一种将网络请求或工作负载分散到多个服务器或计算机资源上的技术&#xff0c;以实现优化资源使用、提高系统吞吐量、增强数据冗余和故障容错能力、以及减少响应时间的目的。在分布式系统、云计算环境、Web服…

day28-lsync服务+scp命令

假设nfs服务器挂了&#xff0c;就要走backup服务器也部署nfs 这种情况下&#xff0c;rsync和nfs要用到同一个文件夹&#xff0c; 所以他俩管理文件夹权限必须一样 1. lsyncrsyncnfs rsync服务 10.0.0.41 1.安装rsync [rootbackup:~]#yum -y install rsync 2.配置rsync[root…

在Notebook中使用backtrader绘图出现 Javascript Error: IPython is not defined

01背景说明 首先&#xff0c;说明一下背景。我的电脑在2024年6月时使用backtrader进行cerebro.plot()是没有问题的&#xff0c;图能够在Notebook中正常显示&#xff0c;没有错误提示。 2024年7月下旬&#xff0c;连续学习和试用了好几个AI工具后&#xff0c;我鬼使神差点了No…

【实现100个unity特效之20】用unity实现物品悬浮和发光像素粒子特效

最终效果 文章目录 最终效果新增飞升粒子效果光圈效果修改不同颜色完结 新增飞升粒子效果 效果 光圈效果 效果 修改不同颜色 完结 赠人玫瑰&#xff0c;手有余香&#xff01;如果文章内容对你有所帮助&#xff0c;请不要吝啬你的点赞评论和关注&#xff0c;你的每一次支持…

Linux硬件-raid(软件版)

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 RAID 在一般的品牌服务器里面基本上都有一个叫阵列卡的硬件&#xff0c;硬盘先连接到阵列卡上面&#xff0c;然后阵列卡再连…

【JavaEE初阶】文件操作和IO

目录 &#x1f334;认识文件 &#x1f6a9;树型结构组织和目录 &#x1f6a9;文件路径&#xff08;Path&#xff09; &#x1f6a9; 文件分类 &#x1f38d;Java 中操作文件 &#x1f6a9; File 概述&#xff1a; &#x1f4cc;属性 &#x1f4cc;构造方法 &#x1f4c…

【解压即玩】电脑端CoinOps整合222G,带遮罩和滤镜,复古拉满

这是另外一种风格的整合包&#xff0c;你可以认为是皮肤&#xff1a; 每选择一个游戏&#xff0c;游戏光碟的封面都会变大&#xff0c;非常的漂亮。 玩起来时游戏界面和另外一种是一样的&#xff1a; 解压即玩。 立即下载&#xff1a;【chumenx.com】【解压即玩】电脑端CoinO…

C的温故而知新:文件输入/输出(C Primer Plus第十三章)

第十三章&#xff1a;文件输入/输出 编写程序&#xff0c;对文件的操作是肯定会遇到的&#xff0c;无论是使用那种语言&#xff0c;都可能会遇到这样类似的需求&#xff0c;因为系统的目的是为人们日常生产生活提供便利&#xff0c;难免会遇到文件的使用。在这一章&#xff0c…

extern关键字及c++中(隐式类型转换时)的引用

int i 0; double db i;//隐式类型转换 const double& rd i; const float rf i;