1、微分实现的代码
主要是使用微分的定义来实现偏微分的功能,
代码如下:
%% 参数为微分的步长x,要微分的点的坐标
function Out = My_diffun(x,y,dilta)
df_div_dx = (My_dif(x+dilta,y)- My_dif(x,y))/dilta;
df_div_dy = (My_dif(x,y+dilta)-My_dif(x,y))/dilta;
Out = [df_div_dx;df_div_dy];
end
My_diffun(x,y,dilta)函数实现部分的代码很简单,看下面(名字起乱了,大家不要看名字,看逻辑就好了大笑)
%% 函数名称为My_dif
%% 定义函数传入的参数是x和y的取值范围分别是-5<=x<=0;-5<=y<=0
function out = My_dif(x,y)
cosx = cos(x);%构造cosx函数点阵
siny = sin(y);%构造siny
a= 1-cosx;
b=1-siny;
c=x-y;
out = siny.*exp(a.^2)+cosx.*exp(b.^2)+c.^2;
end
接下来就是梯度下降法的核心思想了
看:
/———————分割线分割线分割线分割线———————————/
%% 初始化函数x和y
clear all;
clc;
dailta1 = 0.0000001;%设置微分的精度
gama = 0.01;%设置步长
[x,y]=meshgrid(-5:0.1:0);
%% 构造z的点阵
z = My_dif(x,y);
%% 绘制函数的三维图
figure;
mesh(x,y,z);
hold on;
%% 梯度下降法
ii=0;
jj=0;
zz=0;
z0 = My_dif(ii,jj);
df=My_dif(ii,jj);
for aa = -5:1:0
for bb =-5:1:0
ii=aa;
jj=bb;
while abs(df)>=0.01 %&& ii<=0&& ii>=-5 && jj<=0&&jj>=-5
difout = My_diffun(ii,jj,dailta1);%这个时候的偏微
dxdy = -(gama.*difout);
**ii = ii + dxdy(1);
jj = jj + dxdy(2);
df = My_dif(ii,jj)-z0;
z0 = My_dif(ii,jj);
plot3(ii,jj,z0,’pr’);**
zz=zz+1;
end
df = 1;
end
end
主要的思想就是梯度下降法的核心公式,数学公式很重要,算法不仅仅是实现功能的一种固定的步骤,还有就是数学中蕴含的哲学思想。
眼见为实,看效果: