(一)线性方程组求解

包含n个未知数,由n个方程构成的线性方程组为:

其矩阵表示形式为:

其中

一、直接求解法

1、左除法

x=A\b;

如果A是奇异的,或者接近奇异的。MATLAB会发出警告信息的。

2、利用矩阵的分解来求解线性方程组(比单单进行左除速度快)

(1)LU分解(只有方阵可以使用)

LU分解就是分解成一个交换下三角矩阵(也就是说进行一定的操作后才是下三角矩阵)和一个上三角矩阵(不需要变换)的乘积形式。只要A是非奇异的,就可以进行LU分解。

MATLAB提供的LU分解函数对于矩阵进行LU分解:

[L,U]=lu(X);      %X必须是方阵
[L,U,P]=lu(X); %PX=LU。X必须是方阵

实现LU分解之后,线性方程组Ax=b的解就为x=U\(L\b)或x=U\(L\Pb)、

(2)QR分解(A是非奇异的)

QR分解就是分解成一个正交矩阵Q和一个上三角矩阵R的乘积形式。只要A是非奇异的,就可以进行QR分解。QR只能对方阵进行分解。

[Q,R]=qr(X);        %X=QR
[Q,R,E]=qr(X); %XE=QR

实现QR分解之后,解为x=R\(Q\b)或x=E(R\(Q\b))。

(3)Cholesky分解(X是正定的)

如果X是正定的。则将矩阵分解成一个下三角矩阵和上三角矩阵的乘积。上三角矩阵为R,下三角矩阵为其转置,X=R’R.

MATLAB进行CHolesky分解方法:

R=chol(X);
[R,p]=chol(X); %p=0则为正定矩阵,返回一个R,或者p为一个正整数q=p-1,满足R'R=X(1:q,1:q)

则线性方程组的解为x=R\(R’\b)

二、迭代法求解(求解大型系数矩阵的方程组)

1、Jacobi迭代法

(1)原理解释

对于Ax=b,如果A为非奇异,那么A就可以分解成一个对角阵D,一个下三角阵L和一个上三角阵U,使得A=D-L-U。则

然后得到迭代公式为

如果收敛的话,就可得到方程的解。

(2)MATLAB编程求解(= =,很简单的迭代。但是如果没有解的话,会得到NAN= = )

function [y,n]=jacobi(A,b,x0,eps)
%A为系数矩阵,b为向量,x0为初值。 if nargin==3 %输入参数至少为3个
eps=1.0e-6;
elseif nargin<3
error
return
end D=diag(diag(A)); %求A得对角矩阵
L=-tril(A,-1); %求A的下三角阵(没有对主对角线),由于是拆成A=D-L-U,所以前面加了“-”号,下同
U=-triu(A,1); %求A的上三角阵(没有对主对角线)。 B=D\(L+U);
f=D\b;
y=B*x0+f;
n=1; %迭代次数 while norm(y-x0)>=eps
x0=y;
y=B*x0+f;
n=n+1;
end

(3)一个demo

x =

    0.9958
0.9579
0.7916 n = 11

2、Gauss-Serdel迭代法

(1)原理说明

由于每一次的x都已经算出来了,就没比较再从头算一次了。就是省略了无效的迭代次数,然后我们就得到一个新的迭代公式。

(2)MATLAB编程求解

function [y,n]=gauseidel(A,b,x0,eps)
%A为系数矩阵,b为列向量,x0为初值。 if nargin==3
eps=1.0e-6;
elseif nargin<3
error
return
end D=diag(diag(A)); %求A的对角矩阵
L=-tril(A,-1); %求A的下三角阵
U=-triu(A,1); %求A的上三角阵
G=(D-L)\U;
f=(D-L)\b;
y=G*x0+f;
n=1; while norm(y-x0)>=eps
x0=y;
y=G*x0+f;
n=n+1;
end

PS:

使用迭代法,一般只能找到一组解(离初值最近的解)。然后使用迭代法,一定要能收敛才能够使用。

(三)——常微分方程初值问题的数值解法

一般是比较难解出来解析解,所以一般求得离散解就很不错了。

一、龙格——库塔法简介

1、由中值定理可得:

所以,根据上述递推式之后能够计算未知函数y在点,i=0,1,……,n的一列的数值解。

当然,使用的递推公式都会有一个误差累计的问题,所以我们使用龙格——库塔公式:

2、MATLAB封装的龙格——库塔法实现

[t,y]=ode23('fname',tspan,y0);
[t,y]=ode45('fname',tspan,y0);

其中,fname是定义f(t,y)的函数文件名,该函数文件必须返回一个列向量。

tspan形式为[t0,tf],表示求解区间。

y0是初始状态列向量。

t,y分别给出求解的相应向量。

然后自己会自动采用步长大小,所以效率还是不错的。

3、demo1

MATLAB编程求解

t0=0;tf=10;
y0=2;
[t,y]=ode23('funt',[t0,tf],y0); %龙格——库塔法的离散解 y1=sqrt(t+1)+1; %精确解 plot(t,y,'-b*');
hold on;
plot(t,y1,':ro');

红色是精确解,蓝色是离散解,可以得到差距不大。

4、demo2

对于高阶的常微分方程。首先要转换为一阶常微分方程组。即状态方程(上面有两点表示二次导数= =)

令:,则原式化为

MATLAB求解

t0=0;tf=20;
x0=[0;0.25];
[t,x]=ode23('funt',[t0,tf],x0) subplot(1,2,1);plot(t,x);
subplot(1,2,2);plot(x(:,1),x(:,2));

(四)函数极值

1、MATLAB求解方法

x=fmin('fname',x1,x2);       %求单变量函数的最小值
x=fmins('fname',x0); %求多变量函数的最小值

2、没有求最大值的方法,但是我们可以通过求-fmin(-f(x))的方法求最大值

MATLAB学习笔记(七)——MATLAB解方程与函数极值的更多相关文章

  1. Matlab学习笔记1—MATLAB基础知识

    1.1  MATLAB系统环境 1.MATLAB操作界面的组成 (1)MATLAB主窗口 (2)命令行窗口:命令行窗口用于输入命令并显示命令的执行结果. (3) 当前文件夹窗口 如何设置当前文件夹呢? ...

  2. Matlab学习笔记 figure函数

    Matlab学习笔记 figure函数 matlab中的 figure 命令,能够创建一个用来显示图形输出的一个窗口对象.每一个这样的窗口都有一些属性,例如窗口的尺寸.位置,等等.下面一一介绍它们. ...

  3. matlab学习笔记 bsxfun函数

    matlab学习笔记 bsxfun函数 最近总是遇到 bsxfun这个函数,前几次因为无关紧要只是大概看了一下函数体去对比结果,今天再一次遇见了这个函数,想想还是有必要掌握的,遂查了些资料总结如下. ...

  4. matlab学习笔记(一)单元数组

    matlab学习笔记(一)单元数组 1.floor(x) :取最小的整数 floor(3.18)=3,floor(3.98)=3 ceil(x)  :取最大的整数 ceil(3.18)=4,ceil( ...

  5. matlab学习笔记---(1)

    Matlab学习笔记 一. Desktop Basics (Matlab 基础知识) 当你打开Matlab的时候,matlab按照以下默认的方式展示出来. 该桌面主要包括以下几部分内容: 当前文件夹: ...

  6. 【数学建模】MATLAB学习笔记——函数式文件

    MATLAB学习笔记——函数式文件 引入函数式文件 说明: 函数式文件主要用于解决计算中的参数传递和函数调用的问题. 函数式的标志是它的第一行为function语句. 函数式文件可以有返回值,也可以没 ...

  7. (转)Qt Model/View 学习笔记 (七)——Delegate类

    Qt Model/View 学习笔记 (七) Delegate  类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...

  8. Learning ROS for Robotics Programming Second Edition学习笔记(七) indigo PCL xtion pro live

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...

  9. Typescript 学习笔记七:泛型

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

随机推荐

  1. Java Socket 网络编程心跳设计概念

    Java Socket 网络编程心跳设计概念   1.一般是用来判断对方(设备,进程或其它网元)是否正常动行,一 般采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经当掉.用于 ...

  2. ios开发 网络编程浅析(一)

    iphone包含了很多框架和库,从底层的套接字到不同层次的封装,可以方便地给程序添加网络功能. (1)BSD套接字.最底层的套接字,这是Unix网络开发常用的API.如果从其他系统移植程序,而程序用的 ...

  3. 为wordpress添加Canonical标签

    在 WordPress 2.9 之前,让 WordPress 博客支持 Canonical 标签是需要通过插件或者手工修改主题的 header.php 文件来实现.如在主题中加如下的代码: <? ...

  4. [Effective JavaScript 笔记] 第14条:当心命名函数表达式笨拙的作用域

    js函数会根据上下文改变其含义. function double(x){return x*2;} 这是一个函数声明,也可以是一个命名函数表达式(named function expression),取 ...

  5. Powershell常用命令

    Powershell常用命令1.Get-Command 得到Powshell所有命令2.Get-Process 获取所有进程3.Set-Alias 给指定命令重命名 如:Set-Alias aaa G ...

  6. Controller之间传递数据:Block传值

    http://itjoy.org/?p=420 前边我们介绍过属性传值和协议传值,这里介绍一下块传值,块类似于C中的函数指针.在Controller中传递数据非常方便,还是继续上一章的例子,将数据从S ...

  7. PHP中通过加号合并数组

    通常,我们合并多个数组用的是array_merge()函数,其实,PHP手册中关于数组操作符的介绍给了我们更简单的方法,那就是"+"号,看看下面的例子就明白了(详细了解) 代码: ...

  8. vlan与交换机端口模式Access,Hybrid,Trunk

    以太网端口有三种链路类型:Access.Hybrid和Trunk.Access类型的端口只能属于1个VLAN,一般用于连接计算机的端口:Trunk类型的端口可以允许多个VLAN通过,可以接收和发送多个 ...

  9. Burst Balloons

    Given n balloons, indexed from 0 to n-1. Each balloon is painted with a number on it represented by ...

  10. Android Studio项目整合PullToRefresh的问题记录

    PullToRefresh下拉刷新在App中应用非常频繁,然而PullToRefresh是在ADT下开发完成的.如果要将其整合到Android Studio目录下的话颇费周折.前面的文章“Androi ...