工程和科学计算的许多基本方程都是建立在守恒定律的基础之上的,比如质量守恒等,在数学上,可以建立起形如 [A]{x}={b} 的平衡方程。其中{x}表示各个分量在平衡时的取值,它们表示系统的状态或响应;右端向量{b}由无关系统性态的常数组成通常表示为外部激励。矩阵A则表示为由系统各部分相互作用或耦合关系的参数组成的系数矩阵。在工程上则意味着[相互作用][响应]=[激励]。
对于单个方程,可以采用前面介绍的一些求根法加以求解,然而事实上还有一些关系式是彼此相互耦合的,比如复杂电路的基尔霍夫定律。这就需要将这些关系式表示为一个线性代数方程组。下面就此问题介绍MATLAB求解线性代数方程组的一些方法,重点介绍高斯消元法。
目录
对于形如 A*x=b的线性代数方程组,MATLAB提供了两种直接求解的方法:取逆 和“左除”。
MATLAB的矩阵取逆函数为inv(A)
故 x=inv(A)*b
x=A\b
学习过线性代数的同学应该对克莱姆法则并不陌生,这里不再赘述,只是讲一下在MATLAB中的实现:
问题:求解
A=[0.3 0.52 1;0.5 1 1.9;0.1 0.3 0.5];
b=[-0.01 0.67 -0.44]';
D=det(A);
A(:,1)=b;
x(1)=det(A)/D;
A=[0.3 0.52 1;0.5 1 1.9;0.1 0.3 0.5];
A(:,2)=b;
x(2)=det(A)/D;
A=[0.3 0.52 1;0.5 1 1.9;0.1 0.3 0.5];
A(:,3)=b;
x(3)=det(A)/D;
x
>> Clem
x =
-14.9000 -29.5000 19.8000
对于小型方程,使用克莱姆法则还是很方便的,但工程上往往面对的是庞大的方程组问题,这个时候仅仅用克莱姆法则是万万不够的。
高斯消元法尽管是求解联立方程组最古老的方法之一,但直到今天依然是实际应用中最为重要的方法之一。
一般方程组(A*x=b):
步骤:向前消元-->向后回代
向前消元:第一阶段是将A矩阵消为一个上三角矩阵。方法是将第一个方程左右同时乘以
然后用第二个方程去减它这样就消掉了.
类似的,反复这样进行,就可以将原方程组变换为新的“上三角方程组”。
向后回代:第二个阶段是利用“上三角方程组”解出x。
首先解出然后将其带入倒数第二个方程,求解
,以此类推。
这样就成功的解出了x。
然而,不知道大家发没发现,如果在执行向前消元时遇到=0,或者
很小很小,这样就遇到了一个问题——“除数不可以为0”,这就需要每一次执行的时候选出最大的数作为“主元”,将主元作为新的“除数”。
称之前的高斯法叫朴素的高斯消元法,后者为选主元的高斯消元法。
function x = GaussPivot(A,b)
%%建立高斯消元法的实现代码
%求解方程A*x=b
%步骤:
%(1)向前消元;
%(2)向后回代。
%%输入:
%A=系数矩阵
%b=右向量
%%输出:
%x=方程的解向量
[m,n]=size(A);
if m~=n,error("系数矩阵须为方阵");end
nb=n+1;
Aug=[A b];
%向前消元
for k=1:n-1
%选主元(max函数可以传回最大值和最大值索引)
[big,i] = max(abs(Aug(k:n,k)));
ipr = i+k-1;
if ipr~=k
Aug([k,ipr],:) = Aug([ipr,k],:);%交换:将绝对值大的数作主元
end
for i=k+1:n
factor = Aug(i,k)/Aug(k,k);
Aug(i,k:nb) = Aug(i,k:nb)-factor*Aug(k,k:nb);
end
end
%向后回代
x = zeros(n,1);%创建解向量
x(n)=Aug(n,nb)/Aug(n,n);%先求出最后一个值
for i=n-1:-1:1
x(i)=(Aug(i,nb)-Aug(i,i+1:n)*x(i+1:n))/Aug(i,i);
end
end
问题:
%%高斯消元法
A=[0.3 0.52 1;0.5 1 1.9;0.1 0.3 0.5];
b=[-0.01 0.67 -0.44]';
x = GaussPivot(A,b)
结果:
>> GaussPivot_test
x =
-14.9000
-29.5000
19.8000
工程上经常遇到形如如下的方程组:

求解步骤依然是向前消元-->向后回代,只不由于A的稀疏性,再使用高斯消元法就太消耗时间了,书中专门为其设计了代码
function x = Tridiag(e,f,g,r)
%求解三对角方程组
% 由于三对角方程的系数矩阵稀疏,运算量与n成正比,而不是高斯消元的n^3
%%输入:
%e =下对角线
%f = 主对角线
%g =上对角线
%r = 右向量
%%输出:
%x=方程的解向量
n=length(f);
for k=2:n
factor=e(k)/f(k-1);
f(k)=f(k)-factor*g(k-1);
r(k)=r(k)-factor*r(k-1);
end
x(n)=r(n)/f(n);
for k= n-1:-1:1
x(k)=(r(k)-g(k)*x(k+1))/f(k);
end
就上述问题进行求解
e=[0,-1,-1,-1];
f=[2.04,2.04,2.04,2.04];
g=[-1,-1,-1,0];
r=[40.8,0.8,0.8,200.8];
x = Tridiag(e,f,g,r)
>> Tridiag_test
x =
65.9698 93.7785 124.5382 159.4795
声明:文章来源于笔者学习【美】Steven C. CHapra所著,林赐译 《工程于科学数值方法的MATLAB实现》(第4版)的笔记,如有谬误或想深入了解,请翻阅原书。
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
如何学习ruby的正则表达式?(对于假人) 最佳答案 http://www.rubular.com/在Ruby中使用正则表达式时是一个很棒的工具,因为它可以立即将结果可视化。 关于ruby-我如何学习ruby的正则表达式?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1881231/
深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG
文章目录1、自相关函数ACF2、偏自相关函数PACF3、ARIMA(p,d,q)的阶数判断4、代码实现1、引入所需依赖2、数据读取与处理3、一阶差分与绘图4、ACF5、PACF1、自相关函数ACF自相关函数反映了同一序列在不同时序的取值之间的相关性。公式:ACF(k)=ρk=Cov(yt,yt−k)Var(yt)ACF(k)=\rho_{k}=\frac{Cov(y_{t},y_{t-k})}{Var(y_{t})}ACF(k)=ρk=Var(yt)Cov(yt,yt−k)其中分子用于求协方差矩阵,分母用于计算样本方差。求出的ACF值为[-1,1]。但对于一个平稳的AR模型,求出其滞