高等应用数学问题MATLAB求解.第一,二章
参考书为:高等应用数学问题的MATLAB求解(第二版)
a=[1, 1];
% 数值解
for i=3:100,a(i)=a(i-1)+a(i-1);
end
a
a=sym([1, 1]);
% 解析解
for i=3:100,a(i)=a(i-1)+a(i-1);
end
a
啊这,为什么我用不了了
C:\Program Files\MATLAB\R2018b\toolbox\maple
发现是这个文件夹
https://www.voidtools.com/zh-cn/
下载安装everthing,做文件搜索
我替换了一下
dll问价
报错误,新的
https://www.mathworks.com/matlabcentral/answers/489410-sym-x-returns-error-symbolic-math-toolbox-is-installed
这里说了,就是装maple的锅,估计是32位的Maple替换了原本64位matlab自带的maple库,我还能遇到这种事情???
确实是安装的时候在问路径在哪里
这个符号工具箱,2018b没有
你说,这样的操作
确实很狗
pathtool工具,集成了所有的搜索文件
我们这里移除maple的工具箱
看看目录
复制进去
其实我觉得,只要找一个相同版本的替换一下工具箱就行
插入一个语法、
知乎看见这个了,也就是说
以后的版本,函数还是会变化
https://www.mathworks.com/products/symbolic.html
这里推荐了这个,好厉害的样子
买不起
真麻烦,我的符号计算死翘翘了
关于MATLAB的问题请来这里搜索
lookfor模糊搜索
这个里普诺夫方程,好像是自动化使用的多
https://www.mathworks.com/help/releases/R2018b/control/linear-algebra-for-control-design.html
具体的这些矩阵方程的求解
推荐课程
https://ww2.mathworks.cn/support/search.html/videos/matlab-for-teaching-82560.html?fq[]=asset_type_name:video&fq[]=category:symbolic/index&page=1
一些内置的小符号
还是符号
以及一些别的变量的尝试
maple也内置了vps函数
数值计算里面的大佬
简单生成矩阵
矩阵的维数,可以动态变化
就是括号不好匹配
[返回的值]=function_name(参数列表)
好好记住这个函数的调用写法
[U S V]=svd(X)
对X矩阵就行奇异值分解,返回USV三个变量。
冒号表达式:函数的原型是
v=s1:s2:s3
该函数生成一个行向量(就是横着的),s1是起始值,s2是步距(就是一次走的最小的值),s3当然就是结尾了。
小试牛刀
你可以花里胡哨的自己任意发挥
v2向量为1 x 0的空矩阵
v3很好的展示了默认步长为1这个现象
v4则是降序的排列
提取一块:
B=A(v1,v2)
很多时候我们是不要一个大矩阵的,所以就提取,其实就是Python里面的切片法。
v1表示保留行号构成的向量
v2表示保留列号构成的向量
先搞个矩阵
分析一下,这个B1其实使用了两个函数,分块+向量生成。
提取A的全部奇数行,所有列
提取A的3,2,1行
反复三次由首列构成的子矩阵
A矩阵左右翻转
永远记住,分号就是换行
要执行逐元素乘法而不是矩阵乘法,请使用.*运算符
可以很明显的看出来是,对应的位置元素相乘然后生成的
这样是矩阵乘法
串联,拼接什么的
我觉得名字都合适
英文是concatenation
逗号是水平连接
懂就行
分号是换行!!!也就是在[ ]的规约下
前提行一样,就是长度一样,这样摞起来一样的长
列数一样的时候,分号也是可以连接的
其实这些上面都是设计的事情,别那么快想学会,慢下来想一下,为什么。你五分钟搞懂一个概念,比你什么时候都模棱两可的强。一定要体会哪种为什么这么做的感觉。
看出来没有
A(行(横),列(shu))
不常见的用法,蛇形排列
这个的名词解释叫线性索引
线性就是一个的意思
但是,在赋值语句的左侧,您可以指定当前维度之外的元素。阵列的大小增加以容纳新来者。
你看解释
冒号单独指定了该维度中的所有元素
这中间好多知识,写的好麻烦
字丑,自己看啊
norm函数,Excel说了
matlab里面是计算范数的
一个矩阵的三次方根应该有三个结果
上面计算出一个
下面旋转两次得到另外两个
find函数好哇,可以把满足关系的函数的数组下标打印出来
为了好看,转置一下
这个函数就是先把矩阵搞成一列,让你哈偶判断,接着把合适的下标输出、
嵌套把A中NaN的量输出
可以直接把行列坐标打印出来
转置一下
然后,下面报错
第一个表示,A矩阵中的某列元素大于等于5,变1,否则0
我糊涂了,这里
想判定一个A元素都大于或等于5
Matlab在符号计算上面依赖于Maple的SDK
s1=0;
for i=1:100,s1=s1+i;
end
s1
for循环时最强大的循环,可以一直使用
s2=0;
i=1;
while(i<=100)
s2=s2+i
i=i+1
end
s2
while是适合逼近一些条件的时候去收敛,比如求一个最小的m值
内置的计算结果
s=0;
m=0;
while(s<=10000)
m=m+1;
s=s+m;
end,s,m
matlab的矩阵化计算,久负盛名,所以就看看矩阵化计算的好处。
tic,s=0;
for i=1:100000
s=s+1/2^i+1/3^i;
end
toc
tic,i=1:100000;
s=sum(1./2.^i+1./3.^i)
toc
下面是矩阵运算化的结果
function [m,s]=findsum(k)
s=0;
m=0;
while (s<=k)
m=m+1;
s=s+m;
end
函数的编写和调用
一个好习惯,函数名字就是m文件的名字
function A=myhilb(n,m)
if nargout>1,error('太多的输出参数');
end
if nargout==1,m=n;
elseif nargin==0|nargin>2,error('输入了错误的参数');
end
for i=1:n
for j=1:m
A(i,j)=1/(i+j-1);
end
end
以上是自己写的哈密顿矩阵生成函数
这个地方,测试输入的参数个数
其实生成的算法很简单,两个循环就完事了
function k=my_fact(n)
if nargin~=1
error('仅接收一个输入的参数')
end
if abs(n-floor(n))>eps|n<0
error('n要输入一个非负的数');
end
if n>1
k=n*my_fact(n-1)
elseif
any ([0 1]==n)
k=1;
end
一个阶乘的计算程序
可变输入输出个数的处理,多项式相乘的函数,conv,那连乘呢?
function a=convs(varargin)
a=1
for i=1:length(varargin)
a=conv(a,varargin{i});
end
这时所有的输入变量列表由单元变量varargin表示。返回时可以用varargout来表示。
最出名的函数句柄
https://ww2.mathworks.cn/help/matlab/matlab_prog/creating-a-function-handle.html
函数句柄
可用于间接调用函数的变量
函数句柄是一种表示函数的 MATLAB® 数据类型。函数句柄的典型用法是将一个函数传递给另一个函数。例如,你可以将函数句柄用作基于某个值范围计算数学表达式的函数的输入参数。
函数句柄可以表示命名函数或匿名函数。要创建函数句柄,请使用 @
运算符。例如,创建用于计算表达式 x2 – y2 的匿名函数的句柄:
f = @(x,y) (x.^2 - y.^2);
什么是函数句柄?
函数句柄是一种存储指向函数的关联关系的 MATLAB® 数据类型。间接调用函数使您在调用该函数时无需考虑调用位置。函数句柄的典型用法包括:
将一个函数传递到另一个函数(通常称为复合函数)。例如,将函数传递到
integral
和fzero
等积分和优化函数。指定回调函数(例如,响应 UI 事件或与数据采集硬件交互的回调)。
构造以内联方式定义而非存储在程序文件(匿名函数)中的函数的句柄。
从主函数外调用局部函数。
首先明确一点,函数句柄是matlab里面一种数据类型
代码
放大感觉我注意的沟沟弯弯的地方没有很明显
x=[-pi:0.05:-1.8,-1.799:.001:-1.2,-1.2:0.05:1.2,...];
1.201:0.001:1.8,1.81:0.05:pi];
>> plot(x,y)
注意新名词,变步距
是不是效果显著
我手边有个这函数
y=1.1*sign(x).*(abs(x)>1.1)+x.*(abs(x)<=1.1);
用关系表达式绘制的图形,当然了,分段线性的非线性曲线可以由几个有限的转折点绘制。
极坐标下绘图
theta就是就是角度
rho就是密度一样的哪个罗马字母
>> theta=0:0.01:6*pi;
>> rho=5*sin(4*theta/3);
>> polar(theta,rho)
为了方便复制,这里把代码附上
结果
>> t=0:.2:2*pi;
>> y=sin(t);
>> subplot(2,2,1),stairs(t,y);
>> subplot(2,2,2),stem(t,y)
>> subplot(2,2,3),bar(t,y)
>> subplot(2,2,4),semilogx(t,y)
注意这里用了子图函数
第一个2是,窗口分为两行
第二个2是,窗口分为俩列
第三个数是,确定位置
成果
阶梯曲线
火柴杆曲线
直方图
横坐标为对数
一些函数叫隐函数,就是没有办法给解析式
plot()绘制不了
使用ezplot(),定义域机器自己给
也可以自己给定义域
>> ezplot('x^2*sin(x+y^2)+y^2*exp(x+y)+5*cos(x^2+y)')
>> ezplot('x^2*sin(x+y^2)+y^2*exp(x+y)+5*cos(x^2+y)',[-10 10])
注意一开始的小符号,就是L键旁边的旁边的按键
我太贴心了
然后也支持LaTeX的语法
就记住_^分别是下标和上标
a_2^2+b_2^2=c_2^2
就像这样。
现在开始整点立体的,那肯定就是参数方程了,肯定跑不了的我和你说。
>> t=0:.1:2*pi;
>> x=t.^3.*sin(3*t).*exp(-t);
>> y=t.^3.*cos(3*t).*exp(-t);
>> z=t.^2;
>> plot3(x,y,z)
写公式真是一个好累的工作,注意这里是.^全部是单乘
结果好看就行
stem3(x,y,z);hold on;plot3(x,y,z),grid
可以使用stem3绘制火柴杆曲线
接下来在认识一下三维曲面的绘制,一般是二元函数才能绘制这样的图像。就像:
z=f(x,y)
一个三维的曲面图,不是一下就可以绘制出来的。需要先生成网格矩阵数据x和y。然后才可以使用点运算生成Z矩阵。
[X ,Y]=meshgrid(v1,v2)
这就是第一步的工作。里面v1,v2为x,y轴的分隔方式。
>> [x,y]=meshgrid(-3:0.1:3,-2:0.1:2);
>> z=(x.^2-2*x).*exp(-x.^2-y.^2-x.*y);
>> mesh(x,y,z)
>>
你仔细读这个函数,meshgrid,后面是不是给了俩段的分段
>> surf(x,y,z)
>> mesh(x,y,z)
>> waterfall(x,y,z)
三种函数的绘制方式
[x,y]=meshgrid(-2:.1:2);
z=1./(sqrt((1-x).^2+y.^2))+1./(sqrt((1+x).^2+y.^2));
surf(x,y,z)
shading flat
再绘制一个,但是仔细看这个图有毛病
这都无穷值了
xx=[-2:.1:-1.2,-1.1:0.02:-0.9,-0.8:0.1:0.8,0.9:0.02:1.1,1.2:0.1:2];
yy=[-1:0.1:-0.2,-0.1:0.02:0.1,0.2:0.02:.1:1];
[xx,yy]=meshgrid(xx,yy);
z=1./(sqrt((1-x).^2+y.^2))+1./(sqrt((1+x).^2+y.^2));
surf(x,y,z)
shading flat
zlim([0,15])
变步距绘制一下,再到(+-1,0)处
所以再这个区域就变步距,这里Z轴范围还是一样
其实本身函数就有点病态,所以也改变不了两个区域的无穷现象
本来找个视角的图,结果就这
来,绘制一个!!!
等等,再插一个,分段的二维函数如何绘制?
就是这个
其实对于分段函数来说,你总可以使用if的方式绘制,但是它不优雅。我们干点优雅的事情。
[x,y]=meshgrid(-1.5:.1:1.5,-2:.1:2);
z=0.5457*exp(-0.75*y.^2-3.75*x.^2-1.5*x).*(x+y>1)+...
0.7575*exp(-y.^2-6*x.^2).*((x+y>-1)&(x+y<=1))+...
0.5457*exp(-0.75*y.^2-3.75*x.^2+1.5*x).*(x+y<=-1);
surf(x,y,z)
xlim([-1.5 1.5]);
shading flat
一堆错误,才修完
结果
这叫关系表达式,就有真或者假两个状态
视角定义
方位角α x-y平面投影点与y轴负方向的夹角,默认为-37.5
仰角β为视点和x-y平面的夹角。默认为30°
view(方位角,仰角)
改变了视角
[x,y]=meshgrid(-1.5:.1:1.5,-2:.1:2);
z=0.5457*exp(-0.75*y.^2-3.75*x.^2-1.5*x).*(x+y>1)+...
0.7575*exp(-y.^2-6*x.^2).*((x+y>-1)&(x+y<=1))+...
0.5457*exp(-0.75*y.^2-3.75*x.^2+1.5*x).*(x+y<=-1);
surf(x,y,z)
xlim([-1.5 1.5]);
shading flat
view(80,10)
默认
%view(80,10)
快展示一下:
结果
[x,y]=meshgrid(-3:0.1:3,-2:0.1:2);
z=(x.^2-2*x).*exp(-x.^2-y.^2-x.*y);
subplot(224)
surf(x,y,z)
% 标准视图
subplot(221)
surf(x,y,z)
view(0,90);
% 俯视图
subplot(222)
surf(x,y,z)
view(90,0);
% 侧视图
subplot(223)
surf(x,y,z)
view(0,0);
% 正视图
代码
先下载一张照片
注意包保存文件,不能以数字开头
>> W=imread('./unsplash-Oliver Schwendener.jpg');
注意加; 不然太恐怖了。。。
注意tab键自动补全,放在同一个文件夹
牛啊
>> imtool(W)
内置工具显示
读取
>> W1=rgb2gray(W);
>> W2=edge(W1);
>> figure;
>> imtool(~W2)
边缘图,有点好看
下篇文章是关于微积分的