本周科学计算引论结课了,就花了一整天时间把要求的实验报告写了。根据考核说明,算法可以使用各种工具、语言来实现,但由于这门课程的上机实验统一使用的是matlab,再加上我上一次使用matlab大量实践是在劳动节的数学建模华中赛了,还是很有必要重拾起来再熟悉一下。于是乎,一大波坑就等着我去填了。
References:
电子文献:
https://blog.csdn.net/zhanshen112/article/details/79728887
报错:未找到具有匹配签名的构造函数
我编写了一个二分法的函数求解非线性方程,然而当我调用的时候,却遇到报错:“未找到具有匹配签名的构造函数”,这是怎么回事呢?
我们来冷静分析一下。
识破!
原来是我定义的函数名为half,而half也是matlab自带的函数之一,可以使用help functionname
查看函数具体的使用方法与功能。
调用时默认优先使用自带的函数,因此修改函数名为matlab自带函数之外的即可。
报错:矩阵维度必须一致
这是我在画图时遇到的一个问题,首先先补充一下matlab中作函数图像的方法,如下图所示。
当我尝试使用上述方法作简单的函数图像时,并没有报错,而当我想要作出我实验所需函数(如下所示)的图像时,却出现了“矩阵维度必须一致”的错误信息。
1 | y = asin(1 / (1.878 + 0.75 * cos(x))) |
查阅相关资料,我才发现是乘除的时候出现的问题,为此我将其中的除/
修改为乘*
,并用.^
代替^
作乘方计算,即将原函数式修改为:
1 | y = asin(1 * (1.878 + 0.75 * cos(x)) .^ (-1)) |
这样,问题就解决了。
这里我想强调一下在matlab中^
与.^
的区别:.^
是点乘,而^
是乘法。
直接用^
进行乘法的话,在这里即矩阵乘法,也就是说,必须满足前一个矩阵的列数等于后一个矩阵的行数。
而使用.^
点乘操作,是使每一个元素相乘,也就是向量或者矩阵中对应元素相乘,也很好记忆,加个点就是点乘。
函数输出只有一个
这是一个很愚蠢的问题,显然我好久没用了,因为matlab不必使用return返回结果,在函数声明的第一句就确定了返回值的数量和顺序。因此在调用函数的时候,必须也提供对应的变量去接收返回值,否则只能得到第一个返回的元素。
使用diff求导不是导数值
用惯了pytorch,总想着能够自动求导,一查matlab还真有这么一个函数,即diff函数。然而,事实证明它不是我想要的。
我们可以在命令行中使用这一个函数:
- 声明变量x:
syms x
。它代表着声明符号变量x,只有声明了符号变量才可以进行符号运算,包括求导。 - 定义一个需要求导的函数:
f(x) = sin(x) + x ^ 2
。 - 使用diff函数求导:
diff(f(x))
。也可以对已经定义好的m文件中的函数直接求导。
这里,我们会得到ans为2*x + cos(x)
。 - 如果想pretty一些,可以使用pretty函数将结果转化成书面格式:
pretty(ans)
。
然而,当我代入不同的具体数值想得到函数的导数值的时候,发现输出的结果却是0。
使用help查阅diff函数的用法,得到的说明是:
1 | 此MATLAB函数计算沿大小不等于1的第一个数组维度的X相邻元素之间的差分: |
原来这个函数的主要用法是对向量或者矩阵中的元素进行差分计算,当用它来求导时,得到的只是一个表达式,且函数一但复杂,得到的就是一个参数众多的逼近格式。
唉,总而言之,还是老老实实地拿起笔自己算出导函数吧。都用矩阵实验室(matlab)了,手动求个导还是得会的呀。
角度制弧度制互换
无论使用计算器还是编程计算,这都是一个需要注意的点,matlab默认使用的是弧度制,在计算出结果之后,可以使用rad2deg
函数进行转换。
同样的,我推测角度制转弧度制的函数名为deg2rad
,一试,果不其然。这个函数还是挺好记的,英文里有许多同音词与字符的妙用,比如这里的to和2的two,还有at和@,感觉既方便又高级。
保留更多位数
matlab默认是保留4位有效数字,为了提升计算精度,可以使用format long
来增加计算过程中保留的位数。
常用操作
难得开一篇写matlab使用的博文,那就在这补上几个我记忆中的较为常用的命令或操作。
Ctrl+C
终止操作。这跟许多地方都一样,在matlab中,Ctrl+C
平时可以用来粘贴剪切板上的内容,而在程序运行时,可以使用它来终止运行,这在死循环的时候非常有用。clc
清空命令行。bench
测试性能。这其实不是一个很常用的命令,可以跟朋友输这个命令看看自己电脑的性能,下图是我的结果。需要注意的是,笔记本电脑电池使用模式的不同对这个排名影响还是挺大的,如果想让排名高一些的话,请确保电池开在最佳性能的模式。另外,不同的电脑的比较对象可能会不一样,比如学校的台式机和我的笔记本在这里比较的对象就不一样。 常用的还有许多,以后在使用中不断增加,先在这占个位。
最近在b站看到matlab的几个有趣彩蛋,挺有意思,感兴趣可以去瞧瞧。