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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
1 j7 q+ F7 R3 e0 ^( X5 ^& b' q
问题& H3 s- X& z' ^8 m7 t/ H
自定义一个函数,求给定复数的指数、对数、正弦和余弦,并在命令文件中调用该函数。" Z3 C6 q8 Y) d7 i
自定义一个函数,计算一行向量中各元素的均值和标准差。
: R* L; ]3 v$ d1 i5 a求下列方程的根:
3 ?* B6 P! I" W8 ^1 Y" |
: K; U2 C  L) Y8 V' U. _ - v4 `" [2 W; K3 @' F

7 h3 M+ Z; F7 B2 h分析与解答:
0 }' ^8 |' y0 h& H9 n4 d; L# I, K1.实验过程:创建m文件,保存到桌面,重命名位fushu,此时我就创建了一个函数,然后再新建一个m文件作为我们命令文件,实现输入复数并调用函数的功能,然后运行之后,在matlab命令行窗口即可执行 ' {- {+ `8 G% M4 H2 e

" ?' q7 X( o$ ]! D- K0 N+ M实验结果:- n: F0 ?7 Y" Q9 v& Q1 B3 b
6 e* c6 M3 z4 s" p, ]6 _* k

# M8 j: t' i" ?* |* ~: l! k2 n/ x3 y$ a3 l
2.实验过程:1 z9 L% Y5 h- I+ ^- ^0 Z
函数文件:
8 c  E; |, d: Q* V* X$ Z9 `9 y3 t7 l# k. ?2 ]0 y
  • 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);4 r5 I9 t0 g3 S1 F7 c  s# b  g
0 N" ~/ m* C' M
5 m8 J( R! q9 o, F) K
命令文件:
" B% N6 w; Y$ l/ G$ m3 U5 V' ]
* A/ J- P2 a) j; V
  • x=input('x=?');
  • way(x);
    " e5 }5 Q0 J6 C+ v

% Q( B! p) s. G1 b& q3 a2 G+ ?2 d/ B" O/ k. x% O9 ^! N
命令文件保存后运行,然后在命令行窗口输入一个向量
! |7 d1 r2 V( j/ \- @9 L6 o" O0 W$ R. z. |0 S# t0 U
实验结果:
; u, o: }" i( |9 @5 R. M1 ~& G+ t; m' P' V7 A  j! }
  • x=?0:5
  • avg=2.500000
  • std=1.707825
    $ C. V  u  w; y6 y" L
4 L- \  s- E! N! W! M3 N

0 j8 x2 j' W3 f. x9 X3.直接在命令行窗口执行即可
$ V: j: L8 y' z+ G. q* h& K

* h, n" Q9 L+ X2 E
/ w% P0 V. M1 d3 x过程及结果& `; }1 n" }- y; u8 l5 p4 t# A/ e
+ B) ^+ N) D+ R5 F
  • >> f=@(x)exp(x)+x^2+x^(sqrt(x))-100;
  • >> x0=fzero(f,3)
  • x0 =
  •     4.1635
  • >> f(x0)
  • ans =
  •    2.8422e-14
  • 3 V6 D* c0 c: d
6 O. W9 v+ w8 O- }0 k5 `
4 b! M: w8 X7 H
其中fzero(f,a)的意思是在a旁边找一个最接近a的点x使f(x)最接近于零- K6 p6 j: N7 I5 W7 x% {4 }
. v$ s2 o7 P+ A0 B+ {) X: k
总结与心得' }" N! @% B+ T4 q8 i

" j. R7 F5 L) i' E9 p# ?) m$ bMatlab自定义函数的方法:

* x4 W7 k5 G! q" `8 n8 O1.函数文件+调用命令文件:需单独定义一个自定义函数的M文件;; b2 q, B; U: a- M0 P" M0 v
2.直接通过@符号定义.如:f=@(x,y)(x.^2-sin(y)),调用:f(2,3)
- m1 b' N. G9 h1 F% P函数句柄变量f相当于函数的别名,利用它可以间接调用函数1 u) X* @6 B/ E
4 z2 P2 Q% Y  y( N! F; c# M
Matlab的函数中变量的传递
8 i) T+ e; k, V1. 函数所传递参数的数目具有可调性% P1 u* Y5 A, |- A5 f) L% Y

  u1 [! `: U1 Y" d2 u
  • 例子:
  • 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( U  ^+ q/ Q% n% V9 [
  N9 O; J/ |" O4 Z
$ B) t( y" Q! q, r+ {% R
2. maltab 程序与它们函数之间的交互用是按值传递机制。当一个函数调用发生时,matlab将会复制实参生成一个副本,然后把它们传递给函数。它意味着虽然函数修改了输入参数,但它并没有影响到调用者的原值。
. O( _/ X. K1 {- f/ S* b$ u8 o, G9 |+ r
6 b$ l2 @$ l2 LMatlab的匿名函数、子函数和嵌套函数。
, g' S" v; V" s/ q' }匿名函数定义0 `) `* ?* `5 y
fhandle = @(arglist) expr& {+ m1 H' c' H5 D9 ~, O
其中,expr是具体的函数表达式,arglist是指定的函数的自变量。% j1 V' P6 y* \9 h3 k
6 `* G4 ^& J5 B+ V+ N6 m$ P9 s
子函数是在同一函数文件中,主函数之后的由“function”引导的函数,一个函数文件可以有多个子函数。这些子函数在函数文件中的排列顺序可以随意,前提是都要位于主函数后
: U& I+ e- j) h5 ?- T! r9 P) H: _% V$ ]9 Z5 c* K
嵌套函数,即nested function,顾名思义,是嵌套在函数体内部的函数。嵌套函数以function 声明,结束的时候加上end
+ @+ Q- P+ d7 V  x" q! z* d
- x! @5 ^$ m4 ^" Q! G
% X8 s+ j' X* K* u: O- b
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-23 21:39 , Processed in 0.156250 second(s), 26 queries , Gzip On.

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

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

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