找回密码
 注册
关于网站域名变更的通知
查看: 516|回复: 1
打印 上一主题 下一主题

快来学习一下matlab自定义函数是怎样编写的

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-12-19 10:01 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

$ Z( B1 T+ O4 Y6 T2 v问题- I2 i. j( t' y  _, g
自定义一个函数,求给定复数的指数、对数、正弦和余弦,并在命令文件中调用该函数。# T  N& O. v0 X( u. K" C
自定义一个函数,计算一行向量中各元素的均值和标准差。3 j- l1 _) r) X/ E- S
求下列方程的根:/ N! @( s$ `% B5 V& B7 B

5 O. R7 w# X: d' n* D # j( A2 l* M0 m+ j: w
9 |  _1 k( f5 C- ]8 [$ [3 C" d& r
分析与解答:' t4 i! M, m- x+ F4 l  d
1.实验过程:创建m文件,保存到桌面,重命名位fushu,此时我就创建了一个函数,然后再新建一个m文件作为我们命令文件,实现输入复数并调用函数的功能,然后运行之后,在matlab命令行窗口即可执行
& I& t6 `0 m) d" p3 Q* d
! @3 j9 ~4 V3 L实验结果:0 r0 Y, u; g2 y5 ?0 `, d* S

) ]7 f4 x) t0 V+ i$ I* j# d7 Q8 l  ]6 y+ u9 U$ A' r

3 T& c- Q( @/ V4 d$ `2.实验过程:- {$ l) G3 Q0 l5 S, X
函数文件:
" l" P0 \5 g/ W% x. y8 R( d8 b! `4 y# `) O. V/ ^7 m7 w! V7 E( K7 a
  • function output=way(x)
  • n=length(x);
  • sum=0;
  • for i=1:n
  •     sum=sum+x(i);
  •     i=i+1;
  • end
  • avg=sum/n;
  • b=0;
  • for i=1:n
  •     b=b+(x(i)-avg)^2;
  •     std1=sqrt(b/n);
  • end
  • fprintf('avg=%f\n',avg);
  • fprintf('std=%f\n',std1);
    + k' s: p0 T/ [% y
" ~* T) N: k: a
& _) O% ?( K; W5 A
命令文件:
- c0 D$ X2 q0 v5 c# P  [6 I" }& J4 {! k
  • x=input('x=?');
  • way(x);- U+ a5 Z, d+ `% {1 k! P& m

3 s. V3 ~9 m- `, e  A7 Z' q. w5 ~
命令文件保存后运行,然后在命令行窗口输入一个向量
; C- v( b8 T4 ]' R% H' D2 p6 {; D$ O9 i" X$ i
实验结果:
' ?2 a2 H2 b# X8 E' W/ b3 Q
$ R- ^( @+ n6 g9 B$ z3 [0 g
  • x=?0:5
  • avg=2.500000
  • std=1.707825& u- z/ g+ P' Q

1 d4 ~6 p! c& g5 P* h, A7 _# M& L6 q% l7 ?, W2 b2 a8 O- u
3.直接在命令行窗口执行即可
3 k$ X+ s6 f, `& |' O( q+ `  s" k3 |" \
4 D0 b1 ^; ?  n0 Z( g8 w% J: j6 g+ z1 _
* e3 [/ {8 p9 k: O
过程及结果$ `: m2 I; A6 @5 ?, Q3 B

: \6 k& D) i5 c+ N& @( S1 E) e  o
  • >> f=@(x)exp(x)+x^2+x^(sqrt(x))-100;
  • >> x0=fzero(f,3)
  • x0 =
  •     4.1635
  • >> f(x0)
  • ans =
  •    2.8422e-14
  • & V0 F* q+ e" Y& Q0 v3 j

( k& v0 `4 u, P& y( j* b5 R  t; B( e8 X! W
其中fzero(f,a)的意思是在a旁边找一个最接近a的点x使f(x)最接近于零! x+ Q: p: {$ Z3 N8 K

" W4 @1 r  K! U0 W: _3 R总结与心得
& h; d: Z6 k% d9 j$ x1 A" C. ]& I4 N% u2 g9 a5 M' v
Matlab自定义函数的方法:

4 v& S- g, X! z+ G; m4 |1.函数文件+调用命令文件:需单独定义一个自定义函数的M文件;/ N7 p# R% [% x
2.直接通过@符号定义.如:f=@(x,y)(x.^2-sin(y)),调用:f(2,3)( [$ M9 b% G! A, j3 _. D7 v) {
函数句柄变量f相当于函数的别名,利用它可以间接调用函数
/ J: N8 k" T! c6 V- X" F
5 W" M" g6 b& hMatlab的函数中变量的传递
( P- d: f) U7 C) G1. 函数所传递参数的数目具有可调性
/ a/ z* e  A; R# Y" r1 q/ [
# @" y$ ?. c  N( a4 l1 R# T) l& W
  • 例子:
  • function [mag, angle] = polar_value(x, y)
  • msg = nargchk(1,2,nargin);
  • //nargin 这个函数返回调用这个函数时所需要的实际输入参数的个数
  • //实际输入参数的个数必须≥1而且≤2,如果一个函数在被调用时含有过
  • //多或过少的参数,函数nargchk 将会产生一个包含标准错误的字符串
  • //如果参数的个数在允许的范围之内,那么这个函数将返回一个空字符
  • error(msg);
  • //如果msg 是一个包含错误信息的字符串,error函数执行,它将会中止当
  • //前函数并返回到键盘输入状态,在命令窗中显示出错误信息
  • //如果这个信息字符中为空,error 函数将什么也不做,当前函数继续执行
  • if nargin < 2
  • y = 0;
  • end
  • if x == 0 & y == 0
  • msg = 'Both x and y are zero: angle is meaningless!';
  • warning(msg);
  • //显示警告信息并继续执行函数,如果参数错误不是致命的,执行还能继续,则这个将会被调用。
  • end
  • mag = sqrt(x .^2 + y .^2);//极坐标的矢径
  • if nargout == 2
  • angle = atan2(y,x) * 180/pi;//极角
  • end
    0 l4 ]* I8 x) b2 y. {' ^$ O8 T7 d( h

8 W7 H+ T9 C3 F& y% C  d+ N9 i$ s7 H: H2 j
2. maltab 程序与它们函数之间的交互用是按值传递机制。当一个函数调用发生时,matlab将会复制实参生成一个副本,然后把它们传递给函数。它意味着虽然函数修改了输入参数,但它并没有影响到调用者的原值。
* H  B3 ^4 }% X3 M: t
0 }; J, j1 r8 w/ }" tMatlab的匿名函数、子函数和嵌套函数。% Y" v( c" v1 S9 U2 H% ]' o! G; ~
匿名函数定义& K, u% j# f9 b& B6 v# Z: Z
fhandle = @(arglist) expr
8 a  v) j% ?+ Z$ B, n  c/ u4 U其中,expr是具体的函数表达式,arglist是指定的函数的自变量。
" s# H! V% K6 v% q
7 B- u( S0 [$ ]4 j5 }子函数是在同一函数文件中,主函数之后的由“function”引导的函数,一个函数文件可以有多个子函数。这些子函数在函数文件中的排列顺序可以随意,前提是都要位于主函数后- i$ O; W' s! t. \
3 ]1 I7 k* k" b& N4 [! K- u0 f
嵌套函数,即nested function,顾名思义,是嵌套在函数体内部的函数。嵌套函数以function 声明,结束的时候加上end- J& E9 I5 T; l6 p# p
5 [/ p2 Y( y- o' o5 t

/ ^9 G/ B% E, W
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-4 22:41 , Processed in 0.109375 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表