matlab数值微分函数是啥?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab数值微分函数是啥?相关的知识,希望对你有一定的参考价值。
一时想不起来了。
最好又详细的用法,谢谢!
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(varargin1) | isa(varargin1,'function_handle') )
error('第一个参数必须是函数名!');
end
if np<2
error('你没有输入要求导数的参数!');
end
fp = nargin(varargin1);
if np ~= fp + 1
if ischar(varargin1)
aaa=varargin1;
else
aaa=func2str(varargin1);
end
error(['参数个数不符! 你输入的函数 ''',aaa,''' 需要 ',int2str(fp),' 个参数!']);
end
temp=varargin2;
hh=0.001;
temp=temp+0.5*hh;
switch fp
case 1
func_value = feval(varargin1,temp);
grad=(4*func_value)/(3*hh);temp=temp-hh;
func_value = feval(varargin1,temp);
grad=grad-(4*func_value)/(3*hh);temp=temp+3*hh/2;
func_value = feval(varargin1,temp);
grad=grad-func_value/(6*hh);temp=temp-2*hh;
func_value = feval(varargin1,temp);
grad=grad+func_value/(6*hh);
case 2
func_value = feval(varargin1,temp,varargin3);
grad=(4*func_value)/(3*hh);temp=temp-hh;
func_value = feval(varargin1,temp,varargin3);
grad=grad-(4*func_value)/(3*hh);temp=temp+3*hh/2;
func_value = feval(varargin1,temp,varargin3);
grad=grad-func_value/(6*hh);temp=temp-2*hh;
func_value = feval(varargin1,temp,varargin3);
grad=grad+func_value/(6*hh);
case 3
func_value = feval(varargin1,temp,varargin3,varargin4);
grad=(4*func_value)/(3*hh);temp=temp-hh;
func_value = feval(varargin1,temp,varargin3,varargin4);
grad=grad-(4*func_value)/(3*hh);temp=temp+3*hh/2;
func_value = feval(varargin1,temp,varargin3,varargin4);
grad=grad-func_value/(6*hh);temp=temp-2*hh;
func_value = feval(varargin1,temp,varargin3,varargin4);
grad=grad+func_value/(6*hh);
case 4
func_value = feval(varargin1,temp,varargin3,varargin4,varargin5);
grad=(4*func_value)/(3*hh);temp=temp-hh;
func_value = feval(varargin1,temp,varargin3,varargin4,varargin5);
grad=grad-(4*func_value)/(3*hh);temp=temp+3*hh/2;
func_value = feval(varargin1,temp,varargin3,varargin4,varargin5);
grad=grad-func_value/(6*hh);temp=temp-2*hh;
func_value = feval(varargin1,temp,varargin3,varargin4,varargin5);
grad=grad+func_value/(6*hh);
case 5
func_value = feval(varargin1,temp,varargin3,varargin4,varargin5,varargin6);
grad=(4*func_value)/(3*hh);temp=temp-hh;
func_value = feval(varargin1,temp,varargin3,varargin4,varargin5,varargin6);
grad=grad-(4*func_value)/(3*hh);temp=temp+3*hh/2;
func_value = feval(varargin1,temp,varargin3,varargin4,varargin5,varargin6);
grad=grad-func_value/(6*hh);temp=temp-2*hh;
func_value = feval(varargin1,temp,varargin3,varargin4,varargin5,varargin6);
grad=grad+func_value/(6*hh);
otherwise
error('参数超出范围');
end
y = grad; 参考技术A 我自己写了一个函数:
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(varargin1)
|
isa(varargin1,'function_handle')
)
error('第一个参数必须是函数名!');
end
if
np<2
error('你没有输入要求导数的参数!');
end
fp
=
nargin(varargin1);
if
np
~=
fp
+
1
if
ischar(varargin1)
aaa=varargin1;
else
aaa=func2str(varargin1);
end
error(['参数个数不符!
你输入的函数
''',aaa,'''
需要
',int2str(fp),'
个参数!']);
end
temp=varargin2;
hh=0.001;
temp=temp+0.5*hh;
switch
fp
case
1
func_value
=
feval(varargin1,temp);
grad=(4*func_value)/(3*hh);temp=temp-hh;
func_value
=
feval(varargin1,temp);
grad=grad-(4*func_value)/(3*hh);temp=temp+3*hh/2;
func_value
=
feval(varargin1,temp);
grad=grad-func_value/(6*hh);temp=temp-2*hh;
func_value
=
feval(varargin1,temp);
grad=grad+func_value/(6*hh);
case
2
func_value
=
feval(varargin1,temp,varargin3);
grad=(4*func_value)/(3*hh);temp=temp-hh;
func_value
=
feval(varargin1,temp,varargin3);
grad=grad-(4*func_value)/(3*hh);temp=temp+3*hh/2;
func_value
=
feval(varargin1,temp,varargin3);
grad=grad-func_value/(6*hh);temp=temp-2*hh;
func_value
=
feval(varargin1,temp,varargin3);
grad=grad+func_value/(6*hh);
case
3
func_value
=
feval(varargin1,temp,varargin3,varargin4);
grad=(4*func_value)/(3*hh);temp=temp-hh;
func_value
=
feval(varargin1,temp,varargin3,varargin4);
grad=grad-(4*func_value)/(3*hh);temp=temp+3*hh/2;
func_value
=
feval(varargin1,temp,varargin3,varargin4);
grad=grad-func_value/(6*hh);temp=temp-2*hh;
func_value
=
feval(varargin1,temp,varargin3,varargin4);
grad=grad+func_value/(6*hh);
case
4
func_value
=
feval(varargin1,temp,varargin3,varargin4,varargin5);
grad=(4*func_value)/(3*hh);temp=temp-hh;
func_value
=
feval(varargin1,temp,varargin3,varargin4,varargin5);
grad=grad-(4*func_value)/(3*hh);temp=temp+3*hh/2;
func_value
=
feval(varargin1,temp,varargin3,varargin4,varargin5);
grad=grad-func_value/(6*hh);temp=temp-2*hh;
func_value
=
feval(varargin1,temp,varargin3,varargin4,varargin5);
grad=grad+func_value/(6*hh);
case
5
func_value
=
feval(varargin1,temp,varargin3,varargin4,varargin5,varargin6);
grad=(4*func_value)/(3*hh);temp=temp-hh;
func_value
=
feval(varargin1,temp,varargin3,varargin4,varargin5,varargin6);
grad=grad-(4*func_value)/(3*hh);temp=temp+3*hh/2;
func_value
=
feval(varargin1,temp,varargin3,varargin4,varargin5,varargin6);
grad=grad-func_value/(6*hh);temp=temp-2*hh;
func_value
=
feval(varargin1,temp,varargin3,varargin4,varargin5,varargin6);
grad=grad+func_value/(6*hh);
otherwise
error('参数超出范围');
end
y
=
grad; 参考技术B 我自己写了一个函数:
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(varargin1)
|
isa(varargin1,'function_handle')
)
error('第一个参数必须是函数名!');
end
if
np<2
error('你没有输入要求导数的参数!');
end
fp
=
nargin(varargin1);
if
np
~=
fp
+
1
if
ischar(varargin1)
aaa=varargin1;
else
aaa=func2str(varargin1);
end
error(['参数个数不符!
你输入的函数
''',aaa,'''
需要
',int2str(fp),'
个参数!']);
end
temp=varargin2;
hh=0.001;
temp=temp+0.5*hh;
switch
fp
case
1
func_value
=
feval(varargin1,temp);
grad=(4*func_value)/(3*hh);temp=temp-hh;
func_value
=
feval(varargin1,temp);
grad=grad-(4*func_value)/(3*hh);temp=temp+3*hh/2;
func_value
=
feval(varargin1,temp);
grad=grad-func_value/(6*hh);temp=temp-2*hh;
func_value
=
feval(varargin1,temp);
grad=grad+func_value/(6*hh);
case
2
func_value
=
feval(varargin1,temp,varargin3);
grad=(4*func_value)/(3*hh);temp=temp-hh;
func_value
=
feval(varargin1,temp,varargin3);
grad=grad-(4*func_value)/(3*hh);temp=temp+3*hh/2;
func_value
=
feval(varargin1,temp,varargin3);
grad=grad-func_value/(6*hh);temp=temp-2*hh;
func_value
=
feval(varargin1,temp,varargin3);
grad=grad+func_value/(6*hh);
case
3
func_value
=
feval(varargin1,temp,varargin3,varargin4);
grad=(4*func_value)/(3*hh);temp=temp-hh;
func_value
=
feval(varargin1,temp,varargin3,varargin4);
grad=grad-(4*func_value)/(3*hh);temp=temp+3*hh/2;
func_value
=
feval(varargin1,temp,varargin3,varargin4);
grad=grad-func_value/(6*hh);temp=temp-2*hh;
func_value
=
feval(varargin1,temp,varargin3,varargin4);
grad=grad+func_value/(6*hh);
case
4
func_value
=
feval(varargin1,temp,varargin3,varargin4,varargin5);
grad=(4*func_value)/(3*hh);temp=temp-hh;
func_value
=
feval(varargin1,temp,varargin3,varargin4,varargin5);
grad=grad-(4*func_value)/(3*hh);temp=temp+3*hh/2;
func_value
=
feval(varargin1,temp,varargin3,varargin4,varargin5);
grad=grad-func_value/(6*hh);temp=temp-2*hh;
func_value
=
feval(varargin1,temp,varargin3,varargin4,varargin5);
grad=grad+func_value/(6*hh);
case
5
func_value
=
feval(varargin1,temp,varargin3,varargin4,varargin5,varargin6);
grad=(4*func_value)/(3*hh);temp=temp-hh;
func_value
=
feval(varargin1,temp,varargin3,varargin4,varargin5,varargin6);
grad=grad-(4*func_value)/(3*hh);temp=temp+3*hh/2;
func_value
=
feval(varargin1,temp,varargin3,varargin4,varargin5,varargin6);
grad=grad-func_value/(6*hh);temp=temp-2*hh;
func_value
=
feval(varargin1,temp,varargin3,varargin4,varargin5,varargin6);
grad=grad+func_value/(6*hh);
otherwise
error('参数超出范围');
end
y
=
grad;
以上是关于matlab数值微分函数是啥?的主要内容,如果未能解决你的问题,请参考以下文章