诛仙3青云七劫爆多少:matlab数值微分函数是什么?

来源:百度文库 编辑:高考问答 时间:2024/04/27 19:13:18
一时想不起来了。
最好又详细的用法,谢谢!

我自己写了一个函数:
function y=dts(varargin)
% 该函数用来计算任意函数的一阶偏导数(数值方法)
% 其中第一个参数为函数名,后面依次跟函数的参数表(可以是符号参数)
% 后面参数的个数必须与第一个函数名相符合
% 即如果输入的函数名是一元函数,则需要一个参数
% 也就是求该函数在该点的一阶导数值(这里用数值导数)
% 对于多元函数(不超过5个),方法类似,只是后面的参数个数较多
% 本程序只求对给定的函数的第一个自变量的偏导数
%
% 用法举例:
% 1. 求函数 sin 在 pi 点的导数值:
% dts(@sin, pi) 或 dts('sin', pi)
% 2. 求函数 f(x,y) 在点(1, 2) 点关于 x 的一阶偏导数:
% dts(@f,1,2) 或 dts('f',1,2)
% 以此类推.

np = nargin;

if np<1
error('你没有输入任何参数!');
end
if ~(ischar(varargin{1}) | isa(varargin{1},'function_handle') )
error('第一个参数必须是函数名!');
end
if np<2
error('你没有输入要求导数的参数!');
end
fp = nargin(varargin{1});
if np ~= fp + 1
if ischar(varargin{1})
aaa=varargin{1};
else
aaa=func2str(varargin{1});
end
error(['参数个数不符! 你输入的函数 ''',aaa,''' 需要 ',int2str(fp),' 个参数!']);
end

temp=varargin{2};
hh=0.001;
temp=temp+0.5*hh;

switch fp
case 1
func_value = feval(varargin{1},temp);
grad=(4*func_value)/(3*hh);temp=temp-hh;
func_value = feval(varargin{1},temp);
grad=grad-(4*func_value)/(3*hh);temp=temp+3*hh/2;
func_value = feval(varargin{1},temp);
grad=grad-func_value/(6*hh);temp=temp-2*hh;
func_value = feval(varargin{1},temp);
grad=grad+func_value/(6*hh);
case 2
func_value = feval(varargin{1},temp,varargin{3});
grad=(4*func_value)/(3*hh);temp=temp-hh;
func_value = feval(varargin{1},temp,varargin{3});
grad=grad-(4*func_value)/(3*hh);temp=temp+3*hh/2;
func_value = feval(varargin{1},temp,varargin{3});
grad=grad-func_value/(6*hh);temp=temp-2*hh;
func_value = feval(varargin{1},temp,varargin{3});
grad=grad+func_value/(6*hh);
case 3
func_value = feval(varargin{1},temp,varargin{3},varargin{4});
grad=(4*func_value)/(3*hh);temp=temp-hh;
func_value = feval(varargin{1},temp,varargin{3},varargin{4});
grad=grad-(4*func_value)/(3*hh);temp=temp+3*hh/2;
func_value = feval(varargin{1},temp,varargin{3},varargin{4});
grad=grad-func_value/(6*hh);temp=temp-2*hh;
func_value = feval(varargin{1},temp,varargin{3},varargin{4});
grad=grad+func_value/(6*hh);
case 4
func_value = feval(varargin{1},temp,varargin{3},varargin{4},varargin{5});
grad=(4*func_value)/(3*hh);temp=temp-hh;
func_value = feval(varargin{1},temp,varargin{3},varargin{4},varargin{5});
grad=grad-(4*func_value)/(3*hh);temp=temp+3*hh/2;
func_value = feval(varargin{1},temp,varargin{3},varargin{4},varargin{5});
grad=grad-func_value/(6*hh);temp=temp-2*hh;
func_value = feval(varargin{1},temp,varargin{3},varargin{4},varargin{5});
grad=grad+func_value/(6*hh);
case 5
func_value = feval(varargin{1},temp,varargin{3},varargin{4},varargin{5},varargin{6});
grad=(4*func_value)/(3*hh);temp=temp-hh;
func_value = feval(varargin{1},temp,varargin{3},varargin{4},varargin{5},varargin{6});
grad=grad-(4*func_value)/(3*hh);temp=temp+3*hh/2;
func_value = feval(varargin{1},temp,varargin{3},varargin{4},varargin{5},varargin{6});
grad=grad-func_value/(6*hh);temp=temp-2*hh;
func_value = feval(varargin{1},temp,varargin{3},varargin{4},varargin{5},varargin{6});
grad=grad+func_value/(6*hh);
otherwise
error('参数超出范围');
end
y = grad;