【龙年开工:非线性方程(组)求解】牛顿-拉夫逊算法 多输入单输出


【非线性方程求解】割线法

1. 概述

总结上篇博客内容,求解单变量非线性方程 f ( x ) = 0 f(x)=0 f(x)=0 时,牛顿法和割线法的区别在于当前导数的求解方法不同,之后都是用一条直线去近似 f ( x ) f(x) f(x) 。若求解的是非线性方程组,即含有多个输入和多个输出,实现有些不同。下面介绍牛顿法的具体实现,有时也叫作牛顿-拉夫逊(拉弗森)法。

2. 原理步骤

2.1 原理

输入 { x i ∣ i = 1 , … , n x } \{x_{i}|i=1,\dots,nx\} {xii=1,,nx} 经过黑盒子后得到输出 { y j ∣ j = 1 , … , n y } \{y_{j}|j=1,\dots,ny\} {yjj=1,,ny}

图无法显示

但当我想要某种结果 { y j t ∣ j = 1 , … , n y } \{y_{j}^{t}|j=1,\dots,ny\} {yjtj=1,,ny} 时,如何确定输入?为了解决这个问题,先按数学老师教的约定下符号:
X = [ x 1 , … , x n x ] T X=[x_{1},\dots,x_{nx}]^{T} X=[x1,,xnx]T
T T T 为转秩符号,表示 X X X是一个列向量。同理:
Y = [ y 1 , … , y n y ] T Y t = [ y 1 t , … , y n y t ] T \begin{aligned} Y=[y_{1},\dots,y_{ny}]^{T} \\ \\ Y^{t}=[y_{1}^{t},\dots,y_{ny}^{t}]^{T} \end{aligned} Y=[y1,,yny]TYt=[y1t,,ynyt]T
t t t 表示目标输出。为了和之前讲过的步骤比较,把问题转换成求解以下方程,当然,你不想转换也行。
f ( X ) = φ ( X ) − Y t = 0 f(X)=\varphi(X)-Y^{t}=0 f(X)=φ(X)Yt=0
接下来使用以前的老套路,仅仅把 x x x 换成 X X X 。为避免与 X X X 中的元素混淆,我把第 k k k 次迭代后的结果写成上标:
→ f ( X ) = f ( X k ) + f ′ ( X k ) ( X − X k ) + f ′ ′ ( ξ ) ( X − X k ) 2 / ( 2 ! ) → f ( X k ) + f ′ ( X k ) ( X − X k ) = 0 → f ′ ( X k ) ( X − X k ) = − f ( X k ) → X − X k = − f ( X k ) f ′ ( X k ) → X = X k − f ( X k ) f ′ ( X k ) \begin{align} &\to f(X)=f\left(X^{k}\right)+f^{\prime}\left(X^{k}\right)\left(X-X^{k} \right)+{f^{\prime \prime}(\xi)}\left(X-X^{k}\right)^{2}/ (2!) \nonumber\\ \nonumber\\ &\to f\left(X^{k}\right)+f^{\prime}\left(X^{k}\right)\left(X-X^{k}\right)=0 \nonumber\\\nonumber\\ & \to f^{\prime}\left(X^{k}\right)\left(X-X^{k}\right)=-f\left(X^{k}\right) \\ \nonumber\\ &\to \cancel{X-X^{k}=-\frac{f\left(X^{k}\right)}{f^{\prime}\left(X^{k}\right)}} \nonumber\\ \nonumber\\ &\to \cancel{X=X^{k}-\frac{f\left(X^{k}\right)}{f^{\prime}\left(X^{k}\right)}} \nonumber \end{align} f(X)=f(Xk)+f(Xk)(XXk)+f′′(ξ)(XXk)2/(2!)f(Xk)+f(Xk)(XXk)=0f(Xk)(XXk)=f(Xk)XXk=f(Xk)f(Xk) X=Xkf(Xk)f(Xk)

你不能继续套路下去了,因为带有 X X X 的都是矩阵, f ′ ( X k ) f^{\prime}\left(X^{k}\right) f(Xk)表示 f ( x ) f(x) f(x) X X X 的偏导数矩阵,需要根据 f ′ ( X k ) f^{\prime}\left(X^{k}\right) f(Xk) 的维度作不同变换,怎么检查 f ′ ( X k ) f^{\prime}\left(X^{k}\right) f(Xk) 写的对不对呢?暂且将导数理解为分母变化量为1时分子的变化量,则当 X X X变化量为 d X dX dX f ( X ) f(X) f(X)变化量为 d f ( X ) df(X) df(X),检查下式是否成立即可。

图无法显示

当系统为多输入单输出时,即 n x > 1 , n y = 1 nx>1,ny=1 nx>1,ny=1,如果这是线性方程,直接用线性代数的方法求解公式(1)就行了,仅需一步并且能证明有很多解。对于非线性方程,什么情况都有可能存在,需要迭代。公式(1)展开为:
∂ f 1 ∂ x 1 ⋅ d x 1 + ∂ f 1 ∂ x 2 ⋅ d x 2 + ⋯ + ∂ f 1 ∂ x n x ⋅ d x n x = d f 1 \begin{equation} \frac{\partial f_1}{\partial x_1}\cdot dx_1+\frac{\partial f_1}{\partial x_2}\cdot dx_2+\cdots+\frac{\partial f_1}{\partial x_{nx}}\cdot dx_{nx}=df_1 \end{equation} x1f1dx1+x2f1dx2++xnxf1dxnx=df1
我们看到,每个 x i x_i xi 变化都会对 f 1 f_1 f1 产生影响,但问题我只想知道 f 1 = 0 f_1=0 f1=0 X = ? X=? X= 仿照公式(2)的形式,可以写出 X X X f 1 f_1 f1 的导数矩阵 X f 1 ′ X^{\prime}_{f_1} Xf1 并且有:
∂ x 1 ∂ f 1 ⋅ d f 1 + ∂ x 2 ∂ f 1 ⋅ d f 1 + ⋯ + ∂ x n x ∂ f 1 ⋅ d f 1 = d X \begin{equation} \frac{\partial x_1}{\partial f_1}\cdot df_1+\frac{\partial x_2}{\partial f_1}\cdot df_1+\cdots+\frac{\partial x_{nx}}{\partial f_1}\cdot df_1=dX \end{equation} f1x1df1+f1x2df1++f1xnxdf1=dX
公式(3)表示 f 1 f_1 f1 发生变化时会对每个 x i x_i xi 都产生影响,那么知道了 d f 1 df_1 df1 ,求解 X X X 的一种解法是 X X X 沿着 X f 1 ′ X^{\prime}_{f_1} Xf1 的方向迭代就行了,公式(1)可以改写成:
→ ( X − X k ) = − X f 1 ′ ⋅ f ( X k ) → d X = − X f 1 ′ ⋅ f ( X k ) \begin{aligned} \to \left(X-X^{k}\right)=-X^{\prime}_{f_1}\sdot f\left(X^{k}\right) \\ \\ \to dX=-X^{\prime}_{f_1}\sdot f\left(X^{k}\right) \end{aligned} (XXk)=Xf1f(Xk)dX=Xf1f(Xk)
得到增量的表达式后,写成迭代的形式为:
→ X k = X k − 1 + d X k − 1 \begin{align} \to X^{k}=X^{k-1}+dX^{k-1} \end{align} Xk=Xk1+dXk1
其中
d X k − 1 = − X f 1 ′ ⋅ f ( X k − 1 ) X f 1 ′ = P ⊙ 1 f ′ ( X k ) P = [ 1 / n x 1 / n x ⋮ 1 / n x ] n x × 1 \begin{align} dX^{k-1}=&-X^{\prime}_{f_1}\sdot f\left(X^{k-1}\right) \\ \nonumber\\ X^{\prime}_{f_1}=&P\odot\frac{1}{f^{\prime}\left(X^{k}\right)} \\ \nonumber\\ P=& \begin{bmatrix} 1/nx \\ 1/nx \\ \vdots \\ 1/nx \end{bmatrix}_{nx\times 1} \end{align} dXk1=Xf1=P=Xf1f(Xk1)Pf(Xk)1 1/nx1/nx1/nx nx×1
⊙ \odot 是点乘, P P P 的1-范数(每个元素绝对值之和)为1,其元素是对每个 x i x_i xi 增量的权重,当 X X X 沿着 X f 1 ′ X^{\prime}_{f_1} Xf1 梯度的方向时均分,也可以根据迭代的效果设置。

2.2 求解偏导数矩阵

由于 X X X f ( X ) f(X) f(X) φ ( X ) \varphi(X) φ(X)均为列向量, f ( X ) f(X) f(X) X X X 的偏导数写成:
f X ′ ( X ) = [ ∂ f 1 ∂ x 1 ∂ f 1 ∂ x 2 ⋯ ∂ f 1 ∂ x n x ∂ f 2 ∂ x 1 ∂ f 2 ∂ x 2 ⋯ ∂ f n y ∂ x 2 ⋮ ⋮ ⋱ ⋮ ∂ f n y ∂ x 1 ∂ f n y ∂ x 2 ⋯ ∂ f n y ∂ x n x ] \begin{equation} f_{X}^{\prime}(X)= \begin{bmatrix} \frac{\partial f_{1}}{\partial x_{1}} & \frac{\partial f_{1}}{\partial x_{2}} & \cdots & \frac{\partial f_{1}}{\partial x_{nx}} \\ \frac{\partial f_{2}}{\partial x_{1}} & \frac{\partial f_{2}}{\partial x_{2}} & \cdots & \frac{\partial f_{ny}}{\partial x_{2}} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial f_{ny}}{\partial x_{1}} & \frac{\partial f_{ny}}{\partial x_{2}} & \cdots & \frac{\partial f_{ny}}{\partial x_{nx}} \end{bmatrix} \end{equation} fX(X)= x1f1x1f2x1fnyx2f1x2f2x2fnyxnxf1x2fnyxnxfny
使用 f ( x ) f(x) f(x) x k x^{k} xk 的差分来近似函数在该点的导数,有几种差分:

  • 后向差分
    δ x ( x k ) = f ( x k ) − f ( x k − △ x ) △ x \delta_{x}(x^{k})=\frac{f(x^{k})-f(x^{k}-\bigtriangleup x)}{\bigtriangleup x} δx(xk)=xf(xk)f(xkx)

  • 前向差分
    δ x ( x k ) = f ( x k + △ x ) − f ( x k ) △ x \delta_{x}(x^{k})=\frac{f(x^{k}+\bigtriangleup x)-f(x^{k})}{\bigtriangleup x} δx(xk)=xf(xk+x)f(xk)

  • 中心差分
    δ x ( x k ) = f ( x k + △ x ) − f ( x k − △ x ) 2 ⋅ △ x \delta_{x}(x^{k})=\frac{f(x^{k}+\bigtriangleup x)-f(x^{k}-\bigtriangleup x)}{2\cdot \bigtriangleup x} δx(xk)=2xf(xk+x)f(xkx)

2.3 步骤

步骤如下:

  1. 给定初值 X 0 = [ x 1 0 , x 2 0 , … , x n x 0 ] X^{0}=[x_{1}^{0},x_{2}^{0},\dots,x_{nx}^{0}] X0=[x10,x20,,xnx0] ,计算 f ( X 0 ) = [ f 1 0 , f 2 0 , … , f n y 0 ] f(X^{0})=[f_{1}^{0},f_{2}^{0},\dots,f_{ny}^{0}] f(X0)=[f10,f20,,fny0] ;设置差分步长 △ X = [ △ x 1 , △ x 2 , … , △ x n x ] \bigtriangleup X=[\bigtriangleup x_{1},\bigtriangleup x_{2} ,\dots,\bigtriangleup x_{nx}] X=[x1,x2,,xnx] ,根据公式(8)计算偏导数 f X ′ ( X 0 ) f_{X}^{\prime}(X^{0}) fX(X0) ;设置误差限 ϵ \epsilon ϵ ,令初始迭代次数 k = 1 k=1 k=1 ;

  2. 根据公式(4)计算第 k k k 次迭代 X k X^{k} Xk ,计算 f ( X k ) f(X^{k}) f(Xk) ,根据公式(8)计算偏导数 f X ′ ( X k ) f_{X}^{\prime}(X^{k}) fX(Xk)

  3. 判断欧几里得范数 ∥ f ( X k ) ∥ 2 \begin{Vmatrix} f(X^{k}) \end{Vmatrix}_{2} f(Xk) 2 是否小于 ϵ \epsilon ϵ ,说人话就是 f ( X k ) f(X^{k}) f(Xk)是否等于0,如果满足,输出结果 X k X^{k} Xk ;如果不满足,则将迭代次数 k k k 加1以更新迭代次数,重复步骤2和步骤3。

  4. 根据步骤1、步骤2所述的计算偏导数 f X ′ ( X k ) f_{X}^{\prime}(X^{k}) fX(Xk) ,可使用中心差分法来估计:

    • 区别于 X k X^{k} Xk表示第 k k k次迭代的初值,以下 X n x + X^{nx+} Xnx+ X n x − X^{nx-} Xnx表示对 X k X^{k} Xk的第 n x nx nx个元素进行加、减增量, f n y n x + f_{ny}^{nx+} fnynx+ f n y n x − f_{ny}^{nx-} fnynx表示 f ( X n x + ) f(X^{nx+}) f(Xnx+) f ( X n x − ) f(X^{nx-}) f(Xnx)的第 n y ny ny个元素。

    • 增量

      X 1 + = [ x 1 k + △ x 1 , x 2 k , … , x n x k ] → f ( X 1 + ) = [ f 1 1 + , f 2 1 + , … , f n y 1 + ] X 1 − = [ x 1 k − △ x 1 , x 2 k , … , x n x k ] → f ( X 1 − ) = [ f 1 1 − , f 2 1 − , … , f n y 1 − ] ⋮ X n x + = [ x 1 k , x 2 k , … , x n x k + △ x n x ] → f ( X n x + ) = [ f 1 n x + , f 2 n x + , … , f n y n x + ] X n x − = [ x 1 k , x 2 k , … , x n x k − △ x n x ] → f ( X n x − ) = [ f 1 n x − , f 2 n x − , … , f n y n x − ] \begin{aligned} &X^{1+}=[x_{1}^{k}+\bigtriangleup x_{1},x_{2}^{k},\dots,x_{nx}^{k}]\to f(X^{1+})=[f_{1}^{1+},f_{2}^{1+},\dots,f_{ny}^{1+}] \\ \\ &X^{1-}=[x_{1}^{k}-\bigtriangleup x_{1},x_{2}^{k},\dots,x_{nx}^{k}]\to f(X^{1-})=[f_{1}^{1-},f_{2}^{1-},\dots,f_{ny}^{1-}] \\ \vdots \\ &X^{nx+}=[x_{1}^{k},x_{2}^{k},\dots,x_{nx}^{k}+\bigtriangleup x_{nx}]\to f(X^{nx+})=[f_{1}^{nx+},f_{2}^{nx+},\dots,f_{ny}^{nx+}] \\ \\ &X^{nx-}=[x_{1}^{k},x_{2}^{k},\dots,x_{nx}^{k}-\bigtriangleup x_{nx}]\to f(X^{nx-})=[f_{1}^{nx-},f_{2}^{nx-},\dots,f_{ny}^{nx-}] \end{aligned} X1+=[x1k+x1,x2k,,xnxk]f(X1+)=[f11+,f21+,,fny1+]X1=[x1kx1,x2k,,xnxk]f(X1)=[f11,f21,,fny1]Xnx+=[x1k,x2k,,xnxk+xnx]f(Xnx+)=[f1nx+,f2nx+,,fnynx+]Xnx=[x1k,x2k,,xnxkxnx]f(Xnx)=[f1nx,f2nx,,fnynx]

    • 中心差分

      ∂ f j ∂ x 1 = f j 1 + − f j 1 − 2 ⋅ △ x 1 ∂ f j ∂ x 2 = f j 2 + − f j 2 − 2 ⋅ △ x 2 ⋮ ∂ f j ∂ x n x = f j n x + − f j n x − 2 ⋅ △ x n x j = 1 , … , n y \begin{aligned} &\frac{\partial f_{j}}{\partial x_{1}} = \frac{f_{j}^{1+}-f_{j}^{1-}}{2\cdot \bigtriangleup x_{1}} \\ \\ &\frac{\partial f_{j}}{\partial x_{2}} = \frac{f_{j}^{2+}-f_{j}^{2-}}{2\cdot \bigtriangleup x_{2}} \\ &\vdots \\ &\frac{\partial f_{j}}{\partial x_{nx}}=\frac{f_{j}^{nx+}-f_{j}^{nx-}}{2\cdot \bigtriangleup x_{nx}} \\ \\ & j=1,\dots,ny \end{aligned} x1fj=2x1fj1+fj1x2fj=2x2fj2+fj2xnxfj=2xnxfjnx+fjnxj=1,,ny

  5. 根据步骤1、步骤2所述的计算偏导数 f X ′ ( X k ) f_{X}^{\prime}(X^{k}) fX(Xk) ,亦可使用前向差分估计:

    • 增量

      X 1 + = [ x 1 k + △ x 1 , x 2 k , … , x n x k ] → f ( X 1 + ) = [ f 1 1 + , f 2 1 + , … , f n y 1 + ] X 2 + = [ x 1 k + △ x 1 , x 2 k + △ x 2 , … , x n x k ] → f ( X 2 + ) = [ f 1 2 + , f 2 2 + , … , f n y 2 + ] ⋮ X n x + = [ x 1 k + △ x 1 , x 2 k + △ x 2 , … , x n x k + △ x n x ] → f ( X n x + ) = [ f 1 n x + , f 2 n x + , … , f n y n x + ] \begin{aligned} &X^{1+}=[x_{1}^{k}+\bigtriangleup x_{1},x_{2}^{k},\dots,x_{nx}^{k}]\to f(X^{1+})=[f_{1}^{1+},f_{2}^{1+},\dots,f_{ny}^{1+}] \\ \\ &X^{2+}=[x_{1}^{k}+\bigtriangleup x_{1},x_{2}^{k}+\bigtriangleup x_{2},\dots,x_{nx}^{k}]\to f(X^{2+})=[f_{1}^{2+},f_{2}^{2+},\dots,f_{ny}^{2+}] \\ &\vdots \\ &X^{nx+}=[x_{1}^{k}+\bigtriangleup x_{1},x_{2}^{k}+\bigtriangleup x_{2},\dots,x_{nx}^{k}+\bigtriangleup x_{nx}]\to f(X^{nx+})=[f_{1}^{nx+},f_{2}^{nx+},\dots,f_{ny}^{nx+}] \end{aligned} X1+=[x1k+x1,x2k,,xnxk]f(X1+)=[f11+,f21+,,fny1+]X2+=[x1k+x1,x2k+x2,,xnxk]f(X2+)=[f12+,f22+,,fny2+]Xnx+=[x1k+x1,x2k+x2,,xnxk+xnx]f(Xnx+)=[f1nx+,f2nx+,,fnynx+]

    • 前向差分

      ∂ f j ∂ x 1 = f j 1 + − f j k △ x 1 ∂ f j ∂ x 2 = f j 2 + − f j 1 + △ x 2 ⋮ ∂ f j ∂ x n x = f j n x + − f j ( n x − 1 ) + △ x n x j = 1 , … , n y \begin{aligned} &\frac{\partial f_{j}}{\partial x_{1}} = \frac{f_{j}^{1+}-f_{j}^{k}}{ \bigtriangleup x_{1}} \\ \\ &\frac{\partial f_{j}}{\partial x_{2}} = \frac{f_{j}^{2+}-f_{j}^{1+}}{ \bigtriangleup x_{2}} \\ \vdots \\ &\frac{\partial f_{j}}{\partial x_{nx}} = \frac{f_{j}^{nx+}-f_{j}^{(nx-1)+}}{ \bigtriangleup x_{nx}} \\ \\ &j=1,\dots,ny \end{aligned} x1fj=x1fj1+fjkx2fj=x2fj2+fj1+xnxfj=xnxfjnx+fj(nx1)+j=1,,ny

3. 实例测试

f ( x 1 , x 2 ) = ( x 1 − 3 ) 2 + ( x 2 − 4 ) 2 − 25 X 0 = [ − 0.9 , − 0.9 ] △ X = [ 0.0001 , 0.0001 ] ϵ = 0.001 \begin{aligned} f(x_1,x_2)&=(x_1-3)^{2}+(x_2-4)^{2}-25 \\ \\ X^0&=[-0.9,-0.9] \\ \\ \bigtriangleup X&=[0.0001, 0.0001] \\ \\ \epsilon&=0.001 \end{aligned} f(x1,x2)X0Xϵ=(x13)2+(x24)225=[0.9,0.9]=[0.0001,0.0001]=0.001
P P P 取不同值时对应左右结果。




P=[0.5, 0.5]'

P=[1, 0]'
可见搜索方向不同得到不同满足要求的解。

4. 总结

介绍了牛顿-拉夫逊法在求解多输入单输出系统的实现。下回再讨论多输入多输出问题,以及一些应用场景。

5. 详细代码

ExampleNewtonLaphson.m

/*
* Auther:  sanfan66
*/
close all
clear all
%% 计算
x1=-1.2:0.1:1;
x2=-1.5:0.1:1;
[x,y]=meshgrid(x1,x2);
for i=1:size(x,1)
   for j=1:size(x,2) 
    f(i,j)=TestFunction([x(i,j),y(i,j)]');
   end
end

X0=[-0.9; -0.9];
deltaX0=[0.0001; 0.0001];
epsF=0.001;
try
    [index,X,fx,dx] = NewtonLaphsonMethod(X0,deltaX0,epsF,@TestFunction);
catch ME
     disp(ME.message);
end
%% 绘图
figure(1)
mesh(x,y,f)
hold on;
mesh(x,y,f*0)
hold on;
plot3(X(1,:),X(2,:),fx(:),'r-o')
hold on;
xCircle=-2:0.1:8;
plot3(xCircle,sqrt(25-(xCircle-3).^2)+4,xCircle*0,'r')
hold on;
plot3(xCircle,-sqrt(25-(xCircle-3).^2)+4,xCircle*0,'r')
xlabel("x1")
ylabel("x2")
zlabel("f")
xlim([-2 3])
ylim([-1 4])

figure
plot(1:index,fx(1:index),'-o')
xlabel("迭代次数")
ylabel("fx")
grid on;grid minor;
figure
plot(X(1,:),X(2,:),'-o')
xlabel("x1")
ylabel("x2")
% xlim([-0.46 -0.39])
% ylim([-0.34 -0.32])
grid on;grid minor;

fprintf("%5s%10s%10s%10s%10s\n","i","f0","ff","x1","x2");
for i=1:index
fprintf("%5.f%10f%10f%10f%10f\n",i,fx(1),fx(i),X(1,i),X(2,i));
end

function ft=TestFunction(x)
f=(x(1,:)-3).^2+(x(2,:)-4).^2-25;
ft=f';%转为列向量
end

NewtonLaphsonMethod.m

function [i,X,fx,dx] = NewtonLaphsonMethod(X0,deltaX0,epsF,objFun)
nx=size(X0,1);
xContribution=1/nx*ones(nx,1);
% xContribution=[1, 0]';
X(:,1)=X0;
fx(:,1)=objFun(X(:,1));
diffF(1,:)=SolveDiff(X0,deltaX0,objFun);
diffX(:,1)=1./diffF(1,:)';
dx(:,1)=diffX(:,1)*(-fx(:,1)).*xContribution;%将总变化量均分给两部分
maxIter=10;
for i=2:maxIter
    X(:,i)=X(:,i-1)+dx(:,i-1);
    fx(:,i)=objFun(X(:,i));
    diffF(i,:)=SolveDiff(X(:,i),deltaX0,objFun);
    diffX(:,i)=1./diffF(i,:)';
    dx(:,i)=diffX(:,i)*(-fx(:,i)).*xContribution;%将总变化量均分给两部分
    if(norm(fx(:,i))<=epsF)
        break;
    end
    
end

% if(i==maxIter && norm(fx(:,i))>epsF)
%     ME=MException('NewtonLaphsonError:maxIter', '超过最大迭代次数:i=%d,maxIter=%d',i+1,maxIter);
%     throw(ME);
% end

end

SolveDiff.m

function diffF = SolveDiff(X0,deltaX0,objFun)
%X0列向量
fx0=objFun(X0);
deltaX=diag(deltaX0);
XPlus=deltaX+repmat(X0,[1,length(X0)]);
XMinus=-deltaX+repmat(X0,[1,length(X0)]);
fxPlus=objFun(XPlus);
fxMinus=objFun(XMinus);
diffF=(fxPlus-fxMinus)./deltaX0/2;
end
  • 20
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值