-
format long 、 format short 显示结果的更多位小数
作用是控制输出显示的格式
-
vpa()函数变精度
vpa(pi,10) ans = 3.141592654
-
inline()函数 可以将字符串转换成语句
>> f = inline('1/x - (x-1)')
f =
内联函数:
f(x) = 1/x - (x-1)
>> feval(f,1)
ans = 1
- 简单绘图函数ezplot()
a = 1 2 3 4 5
>> b = poly2sym(a)
b =x^4 + 2*x^3 + 3*x^2 + 4*x + 5
>> ezplot(b)
>> ezplot(b,2,8)%2和8表示x轴的范围
-
简单绘制一个黄金分割比的矩形
%%绘制黄金分割比的矩阵 phi = (1 + sqrt(5))/2 x = [ 0 phi phi 0 0] y = [ 0 0 1 1 0] u = [1 1] v = [0 1] plot(x,y,'b',u,v,'b--') text(phi/2,1.05,'\phi')%接下来这几行都是设置注释的 text((1 +phi)/2,-.05,'\phi- 1') text(-.05,.5,'1') text(.5,-.05,'1') axis equal%使x轴和y轴显示的比例一致 axis off%关闭坐标轴的显示 set(gcf,'color','white')
-
计算几行代码运行所花的时间 tic 、(中间这一块放代码)toc
>> tic,figure,toc 时间已过 0.034370 秒
-
round()四舍五入函数
>> round(pi) ans = 3
-
magic()幻方矩阵、每行每列和都是 sum(1:n)/n
>> magic(3) ans = 8 1 6 3 5 7 4 9 2
-
diag() 求对角矩阵、 diag(x,n)——对角矩阵(取对角矩阵上某个对角上的数据)x是要去的矩阵对象,n是第几条对角线
a = 1 2 3 4 5 6 7 8 9 >> diag(a)%默认取主对角线上的元素 ans =[ 1 5 9]’ a = 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 >> diag(a,3)%向上数为正 ans = 8 16 >> diag(a,-3)%向下数为负 ans = 10 18
-
format rat 将结果显示成分数有(用有理数表示)
format rat >> sin(pi/4) ans = 985/1393
-
norm () 矩阵范数
矩阵的范数求法:将每列元素相加,并取结果最大的数作为范数 >>magic(3) a = magic(3) a = 8 1 6 3 5 7 4 9 2 >> b = norm(a) b = 15
-
eig()特征值
* 矩阵A的特征值求法: 求|A - λE|的行列等于零时λ的值即为特征值 * 特征向量: |A - λE| = 0作为系数矩阵,将特征值分别代入求得的基础解系 a = 1 2 3 4 5 6 7 8 0 >> e = eig(a)%返回一个列向量 e = 2170/179 -769/1980 -648/113 [V,D] = eig(A) 返回特征值的对角矩阵 D 和矩阵 V,其列是对应的右特征向量, 使得 AV = VD。 >> [M,N] = eig(a) M = -513/1711 -1019/1364 -413/1495 -445/629 959/1457 -745/1918 -2951/4611 -55/591 778/885 N = 2170/179 0 0 0 -769/1980 0 0 0 -648/113
-
svd()奇异值
-
交换矩阵的某几列元素
a = 1 2 3 4 5 6 7 8 9 b = a(:,1)%表式拿出矩阵a中所有行的第一个元素(即第一列元素) c = a(:)%表示那拿出所有行元素并组成一个列向量 >> a = a(:,[2 1 3]) a = 2 1 3 5 4 6 8 7 9
-
char() 函数将输入的数值转成ascii对应的字符
a = 65 66 67 68 69 >> char(a) ans ='ABCDE'
-
将一串字符转换成数值可用double()函数
>> a = '0123456789'
a = '0123456789'
>> double(a) - '0'%double分别返回每一个字符对应的数值再减去字符0对应的数值
ans = 0 1 2 3 4 5 6 7 8 9
-
计算余数rem(m,n) 余数符号与m相同
-
mod(m,n) 余数符号与n相同
>> a = [27 -27 27 -27]; >> b = [10 10 -10 -10]; >> a = [27 -27 27 -27]'; >> b = [10 10 -10 -10]'; >> t = [a b rem(a,b) mod(a,b)] t =27 10 7 7 -27 10 -7 3 27 -10 7 -3 -27 -10 -7 -7
-
创建函数、函数的创建(函数定义、定义函数)
function [输出] = 函数名(输入)
-
函数句柄
f = @(x)(3*x^3 + 4*x + 5)%函数句柄对应的语法
>> f(10)
ans = 3045
fun = @(a,b,c,d,e)@(x)[sin(a*x(2)) - x(3)*cos(b*x(1));x(3)*sin(c*x(1)) - cos(d*x(2)); e*sin(b*x(1))];
fun(a,b,c,d)
-
打印提示语句函数 disp(‘需要输出的提示语句’)
-
求模、范数函数norm()
* 如果A为矩阵 n=norm(A)返回A的最大奇异值,即max(svd(A)) * n=norm(A,p) 根据p的不同,返回不同的值 p 返回值 1 返回A中最大一列和,即max(sum(abs(A)) 2返回A的最大奇异值,和n=norm(A)用法一样
-
取整函数
(1)round( ),取接近的整数,四舍五入。 (2)floor( ),向下取整,高斯取整,不大于X的最大整数。 (3)ceil( ),向上取整,大于X的最小整数。 (4)fix( ),向0取整,X大于0时与floor( )功能一样,X小于0时与ceil( )功能一样
-
求矩阵中非零元素的个数nnz():number of nonzeros
a = [1 2 3;4 5 0] nnz(a) >>5
-
求矩阵的行数和列数size()
d = size(X) 返回数组X每一维的大小,其中d是一个向量,元素个数为ndims(X)。如果X是一个标量(在MATLAB也就是一个1行乘以1列的数组),size(X)将返回[1 1]。 [m,n] = size(X) 返回矩阵X的尺寸信息, 并存储在m、n中。其中m中存储的是行数,n中存储的是列数。
-
prod()函数
B = prod(A) 这种用法返回数组A中各维元素的乘积。 * 如果A是一个m行一列的(向量),则这种用法即返回这m个元素的乘积; * 如果A是一个m行n列的矩阵,则A的每一列都被看做一个m行1列的向量,分别计算每个向量中元素的乘积,返回给B,因此B是一个1行n列的数组。 >> a = magic(3); >> b = a(:,1); >> prod(b) ans =96
-
find()函数的用法
* b=find(a),a是一个矩阵,查询非零元素的位置,如果X是一个行向量,则返回一个行向量,否则,返回一个列向量。 a = 1 2 3 4 0 6 >> b = find(a) b = 1 2 3 5 6
-
使用reef对函数进行简化(缩减行梯形格式)
>> A = [1 2 3;2 4 7;2 1 4]; >> b = [1;3;4]; >> c = rref([A b]) c = 1.00 0 0 0.6 0 1.00 0 -1.33 0 0 1.00 1.00
matlab程序设计
-
查询工作空间中的变量名who
-
常见的整数操作函数
* ceil 向正无穷大方向取整 * floor 向负无穷大方向取整 * fix 向0取整 * round 四舍五入取整 * isinteger 判断输入是否为整数 * mod 求模 >> mod([1, 2, 3, 4, 5], 2) ans = 1 0 1 0 1 * rem 求余数
- 矩阵求模函数
1、矩阵的模也是矩阵的范数,简单来说就是矩阵中每个元素的平方和再开方。 >> a = [1 2 3]; >> norm(a) ans = 3.741657386773941
- 构造复数函数complex(a,b)
complex(1,2) ans =1.0000 + 2.0000i
* 字符串操作
```matlab
* lower 将字符串全部转换成小写
* upper 将字符串船全部转化成大写
...
-
元胞数组的创建(可以用于存放不同的数据类型)
元胞数组里可以存储不同类型的数据
* 创建方式1 c1 = {'matlab',magic(3),complex(3,4),{'one',1}} c1 =1×4 cell 数组 {'matlab'} {3×3 double} {[3.0000 + 4.0000i]} {1×2 cell} * 创建方式2 >> a = cell(2,2)%创建2 x 2 的数组 a = 2×2 cell 数组 {0×0 double} {0×0 double} {0×0 double} {0×0 double} >> a{1,1} = 'nice'; >> a{1,2} = magic(3) a = 2×2 cell 数组 {'nice' } {3×3 double} {0×0 double} {0×0 double}
注意:cell(m,n)和cell{ }的含义不一样
cell()返回m,n 位置上的元胞 cell{ } 返回m,n 元胞上的数据
结构体
* 结构体的创建用.可以存储不同的数据类型
>> student1.name = 'jason
>> student1.age = 18
>> student1.school = 'peak'
name: 'jason'
age: 18
school: 'peak'
* 利用struct()函数创建结构体数组
>> student = struct('name','jason','age',18,'school','北京大学')
student = 包含以下字段的 struct:
name: 'jason'
age: 18
school: '北京大学'
同样可以创建多维数组
>> student2 = struct('name',{'jason','tony','kven'},'age',{11 ,12 ,13},'addres',{'北京','上海','天津'})
student2 =
包含以下字段的 1×3 struct 数组:%看你的元胞如何书写的用逗号表示行向量用;表示列向量
name
age
addres
>> student2(2,1).addres %结构体通过.的方式索引
ans = '上海'
- 表格类型数据(表格函数的使用table)
>> gendrt = {'m';'f';'m'};
age = [23; 24; 25];
grades = [78 49 45;41 45 45; 78 65 4];
t1 = table(gendrt,age,grades,'RowNames',{'jason','tony','kven'})
t1 3×3 table
gendrt age grades
______ ___ ______________
jason 'm' 23 78 49 45
tony 'f' 24 41 45 45
kven 'm' 25 78 65 4
-
数组的索引
对于一个m x n 的矩阵 a = 1 2 3 4 4 5 6 8 9 5 4 8 7 5 4 1 * 全下标索引 直接写出元素在矩阵中的位置例如 a(1,2)= 2 、a(2,3)= 6 * 单下标索引 将元素按照先左后右的方式进行排序则每个元素的编号位置为:s = (j-1) x m +i * matlab提供了两种下标的转化函数sub2ind 、 ind2sub IND = sub2ind(size,I1,I2,I3,I4....In) [I1,I2,I3,I4....In] = ind2sub(siz,IND) >> i = [3 1 2 3];%在本段程序中代表行 >> j = [1 2 2 2];%在本段程序中代表列 >> ind1 = sub2ind([3,3],i,j]%[3,3]代表一个3x3的矩阵,i和j 构成索引 ind1 = 3 4 5 6%返回单下标索引的值
-
多项式的构造
poly2sym(X) 和poly2str(X,"x") >> a = [1 2 3 4]; >> poly2sym(a) ans = x^3 + 2*x^2 + 3*x + 4 poly()函数根据多项式的根构造多项式 >> a = [1 2 3]; >> b = poly(a) b = 1 -6 11 -6 >> c = poly2sym(b) c =x^3 - 6*x^2 + 11*x - 6
符号运算
* 符号常量的创建
S = sym(A,flag) %其中A是数值常量,flag指定数值常量的输出格式
flag的常用值:
'f' 最接近的浮点数表示
'r' 最接近的有理数表示(带分数、根号、pi等)
'e' 带估计误差的有理表示
'd' 最接近的十进制浮点数表示
* 符号变量的创建
matlab通过sym 、syms实现
程序控制流
1、 程序输入
x = input('请输入内容:') % 可输入任何类型
x = input('请输入:','s')% "s"指定输入的内容为字符串
2、程序的暂停
pause(n) %程序暂停运行n秒
3、程序的输出
disp(x) %输出x的值到窗口
fprintf(fileID,formatspec,A1,A2,...An)
4、程序的提前终止
return
5、程序的报错和警告
error('message')
error('format_message',a1,a2,......)
-
eval ()函数 :将括号里面的字符串视为语句并执行
-
试探结构(异常捕获)
try 语句段1 catch [exception] %方括号表示里面的内容可省略 语句段2 end
数值分析概述
-
求定积分、不定积分的解析解函数int
syms x y = 1/(1 + x^3); Y = int (y,1,1/2)%求函数y在[1,1/2]上的积分 >> y = sin(x); >> F = int(y,x) F =-cos(x)
-
泰勒展开公式taylor(因变量,自变量,‘order’,需要展开的阶数)
syms x y = 1/(1 + x^3); yt = taylor (y,x,'order',6)%将y函数进行5阶泰勒展开(最高次数为5) Y = int(y,x,'order',6)%将泰勒展开的函数求定积分 * 'Order':指定截断参数,对应值为一个正整数。未设置时,截断参数为6,即展开式的最高阶为5。
-
精度控制函数,控制输出的精度vpa()函数
>> a = vpa(pi,4)%输出结果保留四位有效数字 a = 3.142
-
nargin、nargout函数
* nargin为“number of input arguments”的缩写。 在matlab中定义一个函数时, 在函数体内部, nargin是用来判断输入变量个数的函数。 * nargout的作用是在matlab中定义一个函数时, 在函数体内部, nargout指出了输出参数的个数(nargin指出了输入参数的个数)。
-
feval(fun,x)
feval()函数执行指定的函数。也就是说,将想要执行的函数以及相应的参数一起作为feval()的参数,feval()的输出等于想要执行的函数的输出。 >> f = @(x,y)(sin(x) + cos(y)); F = feval(f,[pi/2 pi],[pi/2 pi]) F = 1.0000 -1.0000
MATLAB图形与动画
-
figure创建画布
-
[x,y] = ginput(n) %x,y表示鼠标获取的点坐标 n表示获取点的个数
-
subplot(m,n,p)在同一个绘图窗口中绘制多个图形
-
fplot(f,[m,n])函数(绘图)
f = @(x)sin(3*x^2 + 2*x + 3) fplot(f,[0,10])%绘制f函数的曲线图
-
matlab数值计算
-
创建矩阵的方法规则:
- 矩阵元素必须用[ ]扩起来 如a = [1,2,3]
- 矩阵元素必须用逗号或空格分隔 如 b = [4,5,6]
- 在括号[ ]内矩阵的行与行之间必须用逗号分隔如v = [1,2,3;4,5,6]
-
矩阵元素
- 矩阵元素可以是数,也可以是表达式例如a = [1,2,3;4,3,4] 、x = [2 pi/2 ;sqrt(3) 3+4]
-
符号的作用
1、逗号和分号的作用 * 逗号和分号可以作为指令间的分隔符,matlab允许多条语句在同一行出现 *分号如果出现在指令后,屏幕上将不显示结果 *当一个指令太长时可以用...续行 2、冒号的作用 *用于生成等间距的向量,默认间隔是1,你可以自定义向量的间隔例:a = [1:0.1:4] 结果是长度为40间隔为0.1的向量 * 用于选出矩阵指定行、列及元素 例如:a = [1 2 3;4 5 6;7 8 9] a(1,:)表示取出第一行所有元素 a(:,2)表示取出第二列所有元素 a(:)表示取出所有的元素,并组织成一个列向量 a(2:3)表示将a所有元素排列成列向量取2、3两元素 *用于表示一定的范围 a = [1 2 3;4 5 6;7 8 9] a(1:2,3)表示取出一到二行的第三个元素 *生成等差数列 a = 1:2:9 %% 1 3 5 7 9 *循环语句 sum1 = 0 for i = 1:0.1:5 sum1 += i end
用matlab函数创建矩阵
* 空矩阵a = [ ] * rand()---随机矩阵(元素0~1) rand(n)生成一个nxn的随机矩阵 * eye()---单位矩阵 * zeros()---全部元素都为0的矩阵 * ones()---全部元素都为1的矩阵
matlab 严格区分大小写 matlab 函数名必须小写
矩阵的修改
1、通过指令修改 a = [1,2,3;4,5,6;7,8,9] a(3,3) = 10
数据的保存与获取
-
save ——将工作空间的所有变量存到文件
-
save date——将工作空间中的所有变量存到文件中
-
save date a b ——将工作空间中的a 和 b 变量存到文件中
-
再次需要使用时用load指令调用已经生成的mat文件、
注意:save 和 load配合使用 有函数和命令方式调用 函数方式必须带括号和引号
-
矩阵的运算
1、矩阵加减法的运算法则
* 相加减的矩阵必须是相同大小的(允许其一时标量:数字) 且为对应位置元素大小相加减
2、矩阵的乘法运算
* A 矩阵的列必须和B矩阵的行数相同
* 标量(数字)可以与任何矩阵相乘
3、矩阵的其他运算
inv()——矩阵求逆
det()——行列式的值
eig()——矩阵的特征值
diag(x,n)——对角矩阵(取对角矩阵上某个对角上的数据)x是要去的矩阵对象,n是第几条对角线
()’——矩阵转置
sqrt()——矩阵开方 相当与每个元素开方
4、矩阵的特殊操作
* 矩阵的变维 a = [1:12];b = reshape(a,3,4) c =zeros(3,4);c(:) = a(:)
* 矩阵的变向
rot90:旋转(默认逆时针)
rot90(x,n),其中x表示一个矩阵,n为正整数,默认功能:将矩阵x逆时针旋转90*n度,形成新矩阵,x本身不变。
fliplr:上翻
flipud:下翻
*矩阵的抽取 diag:抽取主对角线; tril:抽取主下三角; triu:抽取主上三角
* 矩阵的扩展
矩阵运算符
* 数组加减(.+ .- )
对应元素相加减(与矩阵加减等效)
*数组乘除(.* ./ .\)
.\ 表示和面的除以前面的
使用上述运算符必须保证两个数组的大小相当
* 矩阵除(\,/)运算
\左除 /右除
A\B 为方程AX = B的解
B/A 为方程XA = B的解(小技巧,A在前面方程中就在前面、在后面方程中就在后面)
A\B = inv(A)*B
而B/A = B*inv(A)
B/A = (A’\B’)’
* 数组乘方.^
对应元素相乘方
a =
1 1 1
2 2 2
3 3 3
b = a .^ a
1 1 1
4 4 4
27 27 27
* 矩阵的次幂^
a =
1 2 3
4 5 6
7 8 8
a^2 =
30 36 39
66 81 90
95 118 133
矩阵标识和子矩阵
B =
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
B1 = B(1:2,[1 3 5])
17 1 15
23 7 16
B2 = B([3 1],:)
4 6 13 20 22
17 24 1 8 15
B([1 3],[2 4]) = zeros(2)%替换B中指定位置的数值
17 0 1 0 15
23 5 7 14 16
4 0 13 0 22
10 12 19 21 3
11 18 25 2 9
matlab多项式
matlab 把多项式表达成一个行向量 其中的元素是按照降幂的方式排列的
f(x) = anxn + an-1xn-1 + an-2xn-2 + ……. a1x1 + a0x0
可用行向量p = [an an-1 an-2 an-3…….. a1 a0] 表示
poly——产生特征多项式系数向量
- 特征多项式一定是n+1维度的
- 特征多项式第一个元素一定是1
特殊的应用矩阵
-
约当阵——将状态空间模型转换为约当标准型
[V,J] = jordan(a) J为约当标准型,V为相似变换阵
语法:jordan()
-
伴随矩阵——将状态空间模型转换为可控标准型
语法:compan()
常用的矩阵函数
* det(A) 方阵A的行列式
* eig(A) 方阵A的特征值和特征向量
* rank(A) 矩阵A的秩
* trace(A) 矩阵A的迹
* expm(A) 矩阵的指数e^A
* sqrtm(A) 矩阵的平方根
* funm(A,'fun') 求一般的方阵函数
a =
0.1000 0.2000 0.3000
0.4000 0.5000 0.6000
0.7000 0.8000 0.9000
funm(a,'sin')
0.0315 0.1157 0.1999
0.2446 0.3091 0.3735
0.4577 0.5024 0.5471
- conv 、convs多项式相乘
- deconv 多项式相除
- 有理多项式求导
-
多项式的展开与组合
矩阵的加减法
-
只有大小相同的两个矩阵才能相加
function[poly] = polyadd(poly1,poly2) if length(poly1) < length(poly2) short = poly1; long = poly2; else short = poly2; long = poly1; end mz = length(long) - length(short); if mz > 0 poly = [zeros(1,mz),short] + long;%将前后两个矩阵大小变成一样 else poly = long + short; end
求多项式在某点的值polyval
求区间均匀分布的函数 linspace(左区间,右区间,均匀分布的个数)
多项式求根roots()函数
将特征向量表示成多项式 “poly2str(特征多项式,‘自变量’)”
>> a = [1 2 3 4];
>> b = poly2str(a,'x')
b =
' x^3 + 2 x^2 + 3 x + 4'
将特征向量表示成多项式 “poly2sym(特征多项式)”
a = 1 2 3 4
>> c = poly2sym(a) %默认自变量为x
c =
x^3 + 2*x^2 + 3*x + 4
利用多项式的根构造多项式poly(填写根)
函数总结
多项式差值函数(interpl1)
yi = interp1(x,y,xi,method) 其中想x和y是原已知数据,xi是需要差值的位置点,yi是差值点的值。
method是差值方法可以设置的差值方法有:
*nearest(寻找最近数据节点):执行速度最快,输送出结果为直角转折
* linear(线性差值):默认,在样本点上斜率变化很大
* spline(样条差值):最耗时,但输出结果最平滑
* cubic(三次方程式差值):也比较耗时,输出结果与spline接近
多项式拟合函数polyfit
调用方法有两种
* p = polyfit(x,y,n)
* [p s] = polyfit(x,y,n)
其中x,y为已知的数据组,n为要拟合的多项式的阶次,向量p返回要拟合多项式的系数相量,向量s为调用函数polyfit或得的错误预估计值
最小二乘法拟合
数值积分
- 计算两个相邻点的差值函数diff(对多项式求导)
- diff(x)——返回x对预设独立变量的一次微分值
- diff(x)——返回x对独立变量t 的一次微分值
- diff(x,n)——返回x对预设变量的n次微分值
- diff(x,’t‘,n)——返回x对独立变量t 的n 次微分值
求原函数(不定积分)
int 函数求原函数
>> y = sin(x);
>> Y = int(y)
Y =-cos(x)
y = x^4 + 2*x^3 + 3*x^2 + 4*x + 5
>> Y = int(y)
Y =x^5/5 + x^4/2 + x^3 + 2*x^2 + 5*x
subplot函数
使用方法:subplot(m,n,p)或者subplot(m n p)。
subplot是将多个图画到一个平面上的工具。其中,m表示是图排成m行,n表示图排成n列,也就是整个figure中有n个图是排成一行的,一共m行,如果m=2就是表示2行图。p表示图所在的位置,p=1表示从左到右从上到下的第一个位置。
牛顿-科茨系列积分公式
-
cumsum()函数
* cumsum是matlab中一个函数,通常用于计算一个数组各行的累加值,函数用法是B = cumsum(A,dim),或B = cumsum(A)。 如果A是一个向量, cumsum(A) 返回一个向量,该向量中第m行的元素是A中第1行到第m行的所有元素累加和; 如果A是一个矩阵, cumsum(A) 返回一个和A同行同列的矩阵,矩阵中第m行第n列元素是A中第1行到第m行的所有第n列元素的累加和;
-
trapz() 梯形积分
-
quad() 辛普森积分
-
quad8() 科茨积分——高精度积分 注意式中的.*、./
-
线性方程组的数值解
- 自接法
- 迭代法
- jacobi雅可比迭代法
- Gauss-seidel 迭代法
- SOR(超松弛)迭代法
稀疏矩阵
-
sparse 创建稀疏矩阵
- 以spdiags创建对角稀疏矩阵
常微分方程的数值解
- 欧拉法
保留位数(四舍五入)
- matlab格式化输出
-
函数拟合
非线性方程组的数值解
-
不动点迭代法
function varargout = fixpts(phifun,x0,ep,maxiter) %不动点迭代法求非线性方程组的数值解 if nargin < 4 maxiter = 500; end if nargin < 3 ep = 1e-8; end iter = 1; xs(iter,:) = x0; exitflag = 1; while exitflag x1 = phifun(x0); xs(iter +1,:) = x1; if norm(x1(:)-x0(:)) <= ep break end x0 = x1; iter = iter +1; if iter > maxiter exitflag = 0; end end [varargout{1:4}] = deal(x1,exitflag,iter,xs);
-
非线性方程组的牛顿法
function varargout = newtons(fun,x0,ep,maxiter) %牛顿迭代法求非线性方程组的数值解 if nargin < 3 maxiter = 500; end if nargin < 3 ep = 1e-8; end if iscell(fun) Jfun = fun{2}; fun = fun{1}; else if isa(fun,'function_handle') fun = sym(fun); elseif ~isa(fun,'sym') error('fun必须是符号表达式或匿名函数') end vars = symvar(fun); J = jacobian(fun,vars); fun = matlabFunction(fun,'vars',{vars}); Jfun = matlabFunction(J,'vars',{vars}); end iter = 1; xs(iter,:) = x0; exitflag = 1; while exitflag fx0 = fun(x0(:).'); Jx0 = Jfun(x0(:).'); if abs(det(Jx0)) <= eps || iter > maxiter exitflag = 0; break end x1 = x0(:) - Jx0\fx0(:); xs(iter +1,:) = x1; if norm(x1(:) - x0(:)) <= ep break end x0 = x1; iter = iter + 1; end [varargout{1:5}] = deal(x1,fun(x1(:).'),exitflag,iter,xs);
-
Matlab自带函数的调用
* roots函数 事实上该函数采用的算法就是矩阵特征值法 调用格式:r = roots(p) >> p = [4,0,-1,1,-3]; >> r = roots(p) r = -1.0683 + 0.0000i 0.9252 + 0.0000i 0.0715 + 0.8682i 0.0715 - 0.8682i * fzero函数 该函数基于布伦特法设计,接合二分法,割线法,以及逆二项差值法的优势求解方程的根 x = fzero(fun,x0)%求解非线性方程在初值为x0处的根 F = @(D,e,Re)@(f)1.14 - 2*log10(e/D + 9.35/Re/sqrt(f)) -1/sqrt(f); D = 0.1; e = 0.01; Re = 5e6; f = fzero(F(D,e,Re),rand) * fsolve函数 F = @(x)[exp(-exp(-x(1) + x(2))) - x(2)*(1 + x(1)^2); x(1)*cos(x(2)) + x(2)*sin(x(1)) - 0.5]; x0 = [0 0]; x = fsolve(F,x0) x = 0.3931 0.3366
数值分析概述
-
求定积分、不定积分的解析解函数int
syms x y = 1/(1 + x^3); Y = int (y,1,1/2)%求函数y在[1,1/2]上的积分 >> y = sin(x); >> F = int(y,x) F =-cos(x)
-
泰勒展开公式taylor(因变量,自变量,‘order’,需要展开的阶数)
syms x y = 1/(1 + x^3); yt = taylor (y,x,'order',6)%将y函数进行5阶泰勒展开(最高次数为5) Y = int(y,x,'order',6)%将泰勒展开的函数求定积分 * 'Order':指定截断参数,对应值为一个正整数。未设置时,截断参数为6,即展开式的最高阶为5。
-
精度控制函数,控制输出的精度vpa()函数
>> a = vpa(pi,4)%输出结果保留四位有效数字 a = 3.142
-
nargin、nargout函数
* nargin为“number of input arguments”的缩写。 在matlab中定义一个函数时, 在函数体内部, nargin是用来判断输入变量个数的函数。 * nargout的作用是在matlab中定义一个函数时, 在函数体内部, nargout指出了输出参数的个数(nargin指出了输入参数的个数)。
-
feval(fun,x)
feval()函数执行指定的函数。也就是说,将想要执行的函数以及相应的参数一起作为feval()的参数,feval()的输出等于想要执行的函数的输出。 >> f = @(x,y)(sin(x) + cos(y)); F = feval(f,[pi/2 pi],[pi/2 pi]) F = 1.0000 -1.0000
非线性方程的数值接法
-
图解法
1、图解法 例1、求函数humps在[0,2]之间的零点 fplot(@humps,[0,2]) hold on plot(xlim,[0,0],'k')
-
fplot(f,[m,n])函数
f = @(x)sin(3*x^2 + 2*x + 3) fplot(f,[0,10])%绘制f函数的曲线图
-
试位法
function [x,fx,xspan] = si_wei_fa(fun,a,b,ep) %试位法 if nargin == 3 ep = 1e-8; end fa = fun(a); fb = fun(b); xspan = [a,b]; if fa*fb >=0 error("试位法必须要求函数两端点值异号") end while abs(b-a) >ep x = b - (b-a)/(fb - fa)*fb; fx = fun(x); if fx*fa < 0 b = x; fb = fx; else a = x; fa = fx; end xspan = [xspan;a,b]; if abs(fx) <ep break end end
-
isscalar(A)判段输入参数是否是一个标量
函数功能:判段输入参数是否是一个标量 语法格式:TF = isscalar(A) 如果矩阵A是一行一列的,则返回逻辑1(true),否则返回逻辑0(false)。 相关函数:isa、isvector