0%

5Matlab-数值计算(课堂)

5.1 线性方程组求解

5.1.1 直接求接法

已知线性方程组: Ax=b;
其中A为已知的n阶方阵,b是含n个分量的已知列向量,而x为含n个分量的未知列向量。
如图:
-w893

  • 1 逆矩阵解法
    对于方程组Ax=b,根据线性代数知识可知,x=b/A;其中1/A为矩阵A的逆矩阵。
    实例:求解线性方程组的解;
    -w523

5.2 非线性方程求解

非线性方程组通常很难求其解析解,更多的是通过数值分析求其近似值。

5.2.1 非线性方程数值求解基本原理

牛顿算法……

  • 1.solve 命令求解非线性方程

Matlab-矩阵和数组运算

矩阵运算有明确而严格的数学规则,矩阵运算规则是按照线性代数运算法则定义的;
数组运算是按照数组的元素逐个进行的。

1 矩阵运算的函数

  • det()
  • rank()
  • inv()

类的抽象和封装

要点提示: 类的抽象是指将类的实现和类的使用分离开,实现的细节被封装并且对用户隐藏,这被称为类的封装

术语

  • 类的合约:
    从类外可以访问的方法和数据域的集合以及预期这些成员如何行为的描述,合称为“类的合约”

  • 类的封装:
    实现的细节经过封装,对用户隐藏起来,这称为类的封装。

  • 抽象数据类型: 类也被称为是一种抽象数据类型

    形象比喻

    类的实现就像是一个对客户隐藏的黑匣子。
    客户通过类的合约使用该类

Java-向方法传递对象参数

提示:给方法传递一个对象,是将对象的引用传递给方法

介绍

java 只用一个参数传递方式:值传递。

Java-对象数组

要点提示:数组既可以存储基本类型值,也可以存储对象。

创建对象数组

以下代码创建了10个Circle对象的数组
Circle[] circleArray= new Circle[10];

初始化数组

为了给一个对象数组进行初始化,可以通过循环实现
示例代码:
for(int i =0; i < circleArray.length; i++){
circleArray[i] = new Circle();
}

注意:

当使用new操作符创建对象数组后,这个数组中的每个元素都是默认值为null的引用变量。

数据区封装

提示: 将数据域设为私有保护数据,并且使易于维护。

为了避免对数据域的直接修改,应该使用private修改符将数据域生命为私有的,这称为数据域封装(data field encapsulation).

访问私有数据域

get(访问器)

修改私有数据域

set(修改器)

Struct

语句格式

1
2
3
4
5
6
struct tag{
member-list
member-list
member-list
...
} variable-list ;
  • tag:结构体标签
  • member-list:标准的变量定义。例如:int i; float j;
  • variable-list: 结构变量,定义在结构的末尾,最后一个分号之前,可以指定一个或者多个结构变量。

用法详解

一般情况下
tag, member-list, variable-list这三部分至少要出现2个。
-w834

结构体的成语可以包含其他结构体,也可以包含指向自己结构体类型的指针。而通常这种指针的应用是为了实现一些更高级的数据结构(如链表和树)。
-w827

如果两个结构体互相包含,则需要对其中一个结构体进行不完整声明。
-w808

结构体变量的初始化

1
2
3
4
5
6
7
8
9
10
11
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
} book = {"结构体", "nianchu", "Programming", 123321};

int main(){
printf("title : %s\nauthor: %s\nsubject: %s\nbook_id: %d\n", book.title, book.author, book.subject, book.book_id)
}

访问结构体成员

  • 成员访问运算符(.)
  • 使用struct关键字来定义结构体类型的变量
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    struct Books Book1;;


    /* Book1 详情*/
    strcpy(Book1.title,"Matlab程序设计");
    strcpy(Book1.author,"bowenki");
    strcpy(Book1.subject,"编程语言");
    Book1.book_id = 123456;

    /* 输出Book1的详细信息*/
    printf("These is information about Book1:\nTitle:%s\nAuthor:%s\nSubject:%s\nBook_id:%d", Book1.title, Book1.author,Book1.subject,Book1.book_id);

    结构作为函数参数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    struct Books {
    char title[50];
    char author[50];
    char subject[100];
    int book_id;

    } book = {"C语言", "niaochu.space","编程语言", 123};


    void printStruct(struct Books book);

    void printStruct(struct Books book){
    printf("Title:%s\n",book.title);
    printf("Author:%s\n",book.author);
    printf("Subject:%s\n",book.subject);
    }

    int main(){

    struct Books Book1;

    strcpy(Book1.title,"Matlab程序设计");
    strcpy(Book1.author,"bowenki");
    strcpy(Book1.subject,"编程语言");
    Book1.book_id = 123456;
    printStruct(Book1);
    }

    指向结构的指针

    为了使用指向该结构的指针访问结构的成员,必须使用->运算符号
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int main(){


    struct Books *pointBook;
    struct Books Book2;
    pointBook = & Book2;

    /* 给Book2初始化*/
    strcpy(pointBook -> title, "我真的要疯了");
    strcpy(pointBook -> author,"我太难了");
    strcpy(pointBook -> subject, "神啊,救救我吧");

    printStruct(Book2);
    }

    位域

    前情提示:

    有些信息在存储中,并不需要占用一个完整的字符,而只需要占用几个或一个二进制位。这时候,可以使用位域。

    实例:

    • 用1位二进位存放一个开关变量,只有0和1两种状态
    • 读取外部文件格式– 可以读取非标准的文件格式。例如:9位的整数

      位域的定义和位域变量的说明

      位域定义和结构体定义相仿:
      1
      2
      3
      4
      struct 位域结构名
      {
      位域列表
      };

其中位域列表的形式为:
类型说明符 位域名: 位域长度
例如:

1
2
3
4
5
6
struct bs{
int a:8;
int b;
int c;

} data;

对于位域的几点说明:

  • 一个位域存储在同一个字节中,如一个字节中所剩余空间不够存放另一个位域时,则会从下一个单元起存放该位域。也可以有意使某位域从下一单元开始:
    1
    2
    3
    4
    5
    6
    7
    struct bs{
    unsigned a:4;
    unsigned : 4; /* 空域 */
    unsigned b:4; /* 从下一单元开始存放 */
    unsigned c : 4;

    }
  • 由于位于不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。
  • 位域可以是无名位域,这时它只用来作填充或调整位置。无名的位域是不能使用的。

* 位域在本质上就是一种结构体类型,但是其成员是按二进制分配的。 *

位域的使用

位域的使用和结构体相同,存在下面两种方法:

  • 位域变量名.位域名
  • 位域变量名 -> 位域名

位域使用的实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
main(){
struct bs{
unsigned a:1;
unsigned b: 3;
unsigned c : 4;

}bit, *pbit;

bit.a = 1;
bit.b = 7;
bit.c 15;
printf("%d,%d,%d,\n",bit.a, bit.b, bit.c );
pbit = & bit;
pbit -> a = 0;
pbit -> b = 0;
pbit -> a = 0;
pbit -> b&3;
pbit -> c|=1;
printf("%d,%d,%d,\n",pbit->a, pbit->b, pbit->c );
}

TestError

实验四 程序设计

  • 1
    -w1184
    分析:没有仔细审题,[1,2]是函数ftest的输入,但不是f1的输入。
  • 2
  • -w1195
    分析:在以下情况下,不重复声明则会出错:
    当子函数中有和全局变量A相同的变量名时,不重复声明时A的值是子函数中局部变量A的值,而不是全局变量A的值。
    因而,为了m文件的安全与正常运行,在子函数中需要使用全局变量A时,最好通过重复声明。

    实验五 符号计算

    • 1.在desolve()函数中,若没有指定变量,则默认变量为t
      1. 利用符号计算实现方程求解的函数是()
      • roots
      • solve
      • dsolve

实验七

  1. -w1189

    . -w1189

对象和类

面向对象程序设计,它会有助于更有效地开发GUI(图形用户界面)和大型软件系统。

为对象定义类

对象object

  • 状态state: 是由具有当前值的数据域来表示的。例如: 圆对象具有一个数据域radius
  • 行为behavior:是由方法定义的

常见类:

Date(long):
- Date类接受一个long参数。作为自从1970年1月1日0点开始的流逝时间
- 这个可以省略。省略时,默认为输出当前时间。
- 具体用法如下:
· 创建Date类
Date date = new Date(l); //
date.setTime(l);// 这行命令可用于修改流逝时间

静态变量

如果想让一个类的所有实例共享数据,就要使用静态变量,也称为类变量。
静态变量将变量值存储在一个公共的内存地址。因为它是公共的地址,所以如果某一个对象修改了静态变量的值,那么同一个类中的所有对象都会收到影响。

静态方法

无须创建类的实例就可以调用静态方法。

实例方法和实例变量都是属于实例的,所有它们在实例创建之后才能使用。

Matlab揭秘

Matlab环境

基本数学定义式

  • 圆周率:pi

  • e的a次方:exp(a)

  • 平方根sqrt()

  • 得到x的自然对数:log(x)

  • 以10为底的对数:log10(x)

  • 反三角函数:在三角函数前面加上a:atan,acos

  • 复数

    • -1的平方根定义为:
  • 计算a的b次方:
    a^b

  • 让计算的结果以有理数的形式显示
    format rat
    2 / 5

    向量与矩阵

    向量

    列向量:

  • a = [2; 1; 4]

  • 对列向量进行数量乘法:
    c = 3;
    b = a * 3;

    行向量

  • 用空格分隔或者逗号分隔

    对列向量和行向量进行转置转换

  • 用’表示转置操作

  • 将列向量转置为行向量:
    a = [2; 1; 4];
    b = a’

使用两个向量进行相加或者相减来创建第三个向量

  • 前提:
    两个向量之间必须类型相同,长度相同

从已存存变量创建大变量

- 前提:
两个向量之间必须类型相同,长度相同

创建等差元素向量

  • aa:b:c
  • 使用linspace(自动确认元素之间的增量)
    • linspace(a,b) 默认创建100个a到b之间的等差向量
    • linspace(a,b,n) 创建n个

      特征化向量

  • length: 返回向量中包含元素的个数
    即可应用到行向量和列向量,也可以应用到矩阵
  • max 或者 min 命令可以找出向量中最大值和最小值
  • sum:求和
  • 求向量的模:
    • (没有复数)先使用对每一元素使用(.*),然后sum求和,最后sqrt开方
    • (有复数时):
      & 需要先计算出该向量的共轭复数根
      & 用conj来计算向量的共轭复数向量
  • abs返回绝对值

向量的点乘和叉乘(数量积和向量积)

$ 点乘
    - dot(a,b)计算a、b两向量的点乘
    - 用点乘来计算向量的模: sqrt(dot(a,a))
    - 对于有复数元素的向量,dot操作也能正常计算
$ 叉乘
    - 要计算叉乘,这两个向量必须是三维的 
    - 使用cross(a,b)来计算叉乘

矩阵基本操作

第三章 绘图与图形

2D绘图基础

  • plot
  • xlabel(‘name’),ylabel(‘name’) :设置坐标轴的标签
    例如:plot(x, y), xlabel(‘x’), ylabel(‘cos(x)’);