- Matlab的符号计算,需要用到一些常用符号工具箱函数
\qquad 例如画出 f ( x ) = x 2 f(x)=x^2 f(x)=x2 在 [ 0 , 3 ] [0,3] [0,3] 上的微分值:
\qquad
(1) 首先构造符号变量x
,符号表达式f(x) = x^2
;再利用工具箱函数 df = diff(f)
直接求出其导数为 df = 2*x
。因此,符号计算的过程不会产生误差。
\qquad
(2) 微分值可以直接使用工具箱函数subs(df,x1)
或者subs(df,x,x1)
,其中x
代表符号表达式df
中所采用的符号变量(或者通过symvar(df)
自动获取),x1
为待求解的点
\qquad
多变量函数在涉及到需要采用不同符号变量的时候,可以采用subs(df,symvar(df),x1)
的方式
\qquad
(3) 通过vpa(x,n)
设置符号数x
的精度为n
\qquad (4) 最后将符号数强制类型转换为浮点型数值
\qquad
其中,(2)~(4) 综合在一起就是val = double(vpa(subs(df,symvar(df),x0),4));
% symbolic
syms x
f2 = x^2
figure(2),ezplot(f2,[0,3]);hold on;
x1 = 0:0.1:3;
val2 = diff1_s(f2, x1);
plot(x1,val2)
legend('x^2','2x')
function val = diff1_s(f, x1)
df = diff(f); % symbolic math toolbox
val = double(vpa(subs(df,symvar(df),x1),4));
end
运行结果:
\qquad
- Matlab的数值计算,可以采用“匿名函数”作为函数的参数。
\qquad 相应的数学运算(例如积分、微分),需要编写对应的数值算法,例如画出 f ( x ) = x 2 f(x)=x^2 f(x)=x2 在 [ 0 , 3 ] [0,3] [0,3] 上的微分值:
\qquad (1) 微分运算可以采用“中心差分”的公式,因此数值计算包含了计算误差
\qquad (2) 由于是数组运算,定义匿名函数时采用了“点乘”的方式,配合数值运算的需要
% numerical
x1 = 0:0.1:3;
f1 = @(x)(x.^2)
figure(1)
plot(x1,f1(x1));hold on;
val1 = diff1_c(f1,x1,0.1);
plot(x1,val1);
legend('x^2','2x')
function val = diff1_c(f,x,h)
val = (f(x+h)-f(x-h))/(2*h);
end
运行结果:
- 以最速下降法的实现为例,可参考:
1.《最速下降法的实现及可视化——基于matlab符号计算》
2.《最速下降法的python实现——基于数值计算》