matlab 数值分析 非线性方程与方程组的数值解法

  • feval

function x=fun(a,b)
x=a+b;
调用
1.feval(@fun,a,b);
2.feval(‘fun’,a,b);
作为参数时
function x=main(fun,y,yy)
c=feval(fun,a,b);

  • @(x)
    表示f为函数句柄,@(x)为定义句柄的运算符,这样的函数句柄指向函数表达式。
    f=@(x)acos(x)
    相当于建立了一个函数文件
    %f.m
    function y=f(x)
    y=acos(x)
    %erfen.m
    feval(f,2)

  • 牛顿法中函数句柄求导
    fun=@(x)a*x+b;
    作为参数
    function [x,k]=fnewton(fun,x0,e)
    求其导函数,若
    dfun=diff(fun)
    报错
    错误使用 diff
    类 ‘function_handle’ 不支持函数 ‘diff’。

可通过syms将函数句柄转换为符号函数
用diff求导后
再通过matlabFunction转换为函数句柄

syms x; % 通过符号变量将匿名函数转换为符号函数
y=fun(x);
dfun=matlabFunction(diff(y)) % 通过matlabFunction将符号函数转换为匿名函数
  • fzerotx
    fzero实现zeroin算法(二分法,割线法和IQI算法)
    fzerotx为fzero简化而来
    fzerotx有两个输入参数,第一个输入参数指定要计算零解的函数F(x);第二个参数指定初始的搜索空间[a,b]
bessj0=inline('besselj(0,x)') % 第一类零阶贝塞尔函数J0(x)
for n=1:10
z(n)=fzerotx(bessj0,[(n-1) n]*pi);
end
  • 一个函数作为参数传递给另一个函数
    三种方法:
    1.函数句柄
    2.内嵌对象
    3.匿名函数

函数句柄:在一个内部函数,或定义于M文件的函数名字前加‘@’符号
@cos
@humps
@bessj0
其中bessj0.m为一个含两行代码的m文件

function y=bessj0(x)
y=besslj(0,x);

这样,句柄就可以用作函数的函数的输入参数

z=fzerotx(@bessj0,[0 pi]);

其中@besslj也是合法的函数句柄,对应一个带两个输入参数的函数

内嵌对象:是一种定义简单函数的方法,不用生成新的文件
F=inline(‘cos(pi*t)’);
F=inline(‘besselj(0,x)’);
内嵌对象可以作为函数的函数的参数,如
z=fzerotx(F,[0 pi]);
内嵌对象可以用来直接计算函数的值
re=F(z);

匿名函数
从MATLAB第七版开始,内嵌对象可以被匿名函数代替

F=@(t)cos(pi*t);
F=@(z)z^3-2*z-5;
F=@(x)besseij(0,x);
这些对象称为匿名函数是因为类似
@(arguments)expression
的结构定义了函数句柄,但并没有给它一个名字

M文件,内嵌对象和匿名函数,可以定义超过一个输入参数的函数。如将这些附加参数的值可以通过fzerotx传递给目标函数。
如J0(x)=0.5
定义一个带两个或者三个参数的内嵌对象
F=inline(‘besselj(0,x)-y’,’x’,’y’)
或者
B=inline(‘besselj(n,x)-y’,’x’,’n’,’y’)
定义一个带两个或者三个参数的匿名函数
F=@(x,y)besselj(0,x)-y
或者
B=@(x,n,y)besselj(n,x)-y
执行
xi=fzerotx(F,[0 2], .5)
或者
xi=fzerotx(F,[0 2],0, .5)
可得结果
也可以使用feval对函数参数求值。表达式
feval(F,x, )等价于F(x, )
区别在于,使用feval时,允许F作为一个被传递过来的参数。

猜你喜欢

转载自blog.csdn.net/weixin_42402978/article/details/82018086