在线编译器 https://matlab.mathworks.com/?elqsid=umic49viv8wu5r6fckew
第1章 matlab基础知识
第1节 输出函数
1. 使用disp
函数
disp
函数可用于输出变量的值或者字符串。
% 输出字符串
disp('Hello, MATLAB!'); %显示Hello, MATLAB!% 输出变量
x = 10;
disp(x); %显示10% 输出数组元素
A = [10, 20, 30, 40, 50];
disp(A); %显示10 20 30 40 50
2. 使用fprintf
函数
fprintf
函数能按照指定的格式输出数据,这和C语言里的printf
函数类似。
% 输出格式化的字符串和变量
x = 3.14159;
fprintf('The value of x is %.2f\n', x); %保留2位小数,并四舍五入,显示3.14
3. 使用sprintf
函数
sprintf
函数和fprintf
函数类似,不过它是把格式化后的字符串返回,而非直接输出。
% 将格式化后的字符串赋值给变量
x = 2.71858;
str = sprintf('The value of x is %.3f', x);
disp(str); %保留3位小数,并四舍五入,显示2.719
4. 直接在命令窗口输入变量名
在命令窗口直接输入变量名,回车后就能显示变量的值。
y = [1, 2, 3, 4, 5];
y
第2节 input输入函数
在MATLAB中,input
函数用于从用户处获取输入,它有多种使用方式,下面为你详细介绍其语法和示例。
基本语法
1. x = input(prompt)
这种语法会在命令窗口显示prompt
提示信息,然后等待用户输入内容,最后将用户输入的内容作为结果返回给变量x
。如果用户输入的是有效的MATLAB表达式,MATLAB会计算该表达式的值并返回;如果输入的是字符串,需要用单引号将其括起来。
x = input('请输入一个数字: ');
disp(['你输入的数字是: ', num2str(x)]);
在这个示例里,运行代码后命令窗口会显示请输入一个数字:
,等待用户输入。若用户输入5
,程序会把这个数字赋值给变量x
,并在后续显示出你输入的数字是: 5
。
2. x = input(prompt,'s')
在这种形式中,'s'
参数表明将用户输入的内容按字符串形式处理,无论用户输入什么,都会直接作为字符串返回给变量x
,而不会对其进行表达式计算。
name = input('请输入你的名字: ','s');
disp(['你输入的名字是: ', name]);
运行此代码,命令窗口会显示请输入你的名字:
,当用户输入张三
时,程序会把张三
作为字符串赋值给变量name
,并显示你输入的名字是: 张三
。
输入验证和错误处理
在实际使用中,为保证输入的有效性,可能需要对用户输入进行验证和错误处理。以下是一个简单的示例,确保用户输入的是正数:
while truenum = input('请输入一个正数: ');if num > 0disp(['你输入的正数是: ', num2str(num)]);break;elsedisp('输入无效,请输入一个正数。');end
end
这个代码会持续提示用户输入正数,若用户输入的不是正数,会显示错误提示并要求重新输入,直到输入有效的正数为止。
综上所述,input
函数是MATLAB中获取用户输入的重要工具,可根据具体需求选择合适的语法形式。
第3节 算术运算
在MATLAB里,*
与.*
、/
与./
是用途不同的运算符,下面为你详细讲解它们的区别以及MATLAB里的其他常见运算符。
*
和.*
的区别
*
(矩阵乘法运算符):用于执行矩阵乘法,需遵循矩阵乘法规则,即第一个矩阵的列数要和第二个矩阵的行数相等。.*
(点乘运算符):用于数组对应元素相乘,要求参与运算的两个数组大小相同,会把两个数组对应位置的元素相乘。
以下是示例代码:
% 定义矩阵 A 和 B
A = [1, 2; 3, 4];
B = [5, 6; 7, 8];% 矩阵乘法
C = A * B;
disp('矩阵乘法 A * B 的结果:');
disp(C);% 数组点乘
D = A .* B;
disp('数组点乘 A .* B 的结果:');
disp(D);
输出结果:
矩阵乘法 A * B 的结果:19 2243 50
数组点乘 A .* B 的结果:5 1221 32
/
和./
的区别
/
(矩阵右除运算符):用于求解线性方程组X * B = A
的解X
,相当于X = A / B = A * inv(B)
,不过MATLAB会采用更高效的算法避免直接求逆。./
(点除运算符):用于数组对应元素相除,要求参与运算的两个数组大小相同,会用第一个数组的每个元素除以第二个数组对应位置的元素。
以下是示例代码:
% 定义矩阵 A 和 B
A = [1, 2; 3, 4];
B = [5, 6; 7, 8];% 矩阵右除
C = A / B;
disp('矩阵右除 A / B 的结果:');
disp(C);% 数组点除
D = A ./ B;
disp('数组点除 A ./ B 的结果:');
disp(D);
输出结果:
矩阵右除 A / B 的结果:-3.0000 -2.00004.0000 3.0000
数组点除 A ./ B 的结果:0.2000 0.33330.4286 0.5000
MATLAB中的其他常见运算符
算术运算符
+
:用于标量、数组和矩阵的加法运算。-
:用于标量、数组和矩阵的减法运算。^
:矩阵幂运算,用于计算矩阵的幂。.^
:点幂运算符,用于计算数组每个元素的幂。
关系运算符
==
:判断是否相等,返回逻辑数组。~=
:判断是否不相等,返回逻辑数组。>
:判断是否大于,返回逻辑数组。<
:判断是否小于,返回逻辑数组。>=
:判断是否大于等于,返回逻辑数组。<=
:判断是否小于等于,返回逻辑数组。
逻辑运算符
&
:逻辑与运算,对两个逻辑数组或标量逐元素进行逻辑与操作。|
:逻辑或运算,对两个逻辑数组或标量逐元素进行逻辑或操作。~
:逻辑非运算,对逻辑数组或标量逐元素进行逻辑非操作。&&
:短路逻辑与,用于标量逻辑与运算,若第一个操作数为false
,则不计算第二个操作数。||
:短路逻辑或,用于标量逻辑或运算,若第一个操作数为true
,则不计算第二个操作数。
其他运算符
:
:冒号运算符,用于创建向量、指定索引范围等。'
:矩阵转置运算符,用于求矩阵的转置。.
:结构体成员访问运算符,用于访问结构体的成员。
第5节 常用函数
fix、power、abs
第2章 matlab程序设计
第1节 if判断语句
在MATLAB里,if
语句用于依据条件判断来决定是否执行特定的代码块。它有多种形式,下面为你详细介绍。
1. 基本的if
语句
这种形式只有一个条件判断,当条件为真时,执行对应的代码块。
x = 10;
if x > 5disp('x 大于 5');
end
在这个例子里,由于x
的值是10,大于5,所以条件为真,会执行disp('x 大于 5');
语句。
2. if - else
语句
当条件为真时,执行if
后面的代码块;当条件为假时,执行else
后面的代码块。
x = 3;
if x > 5disp('x 大于 5');
elsedisp('x 小于或等于 5');
end
这里x
的值是3,不大于5,条件为假,因此会执行disp('x 小于或等于 5');
语句。
3. if - elseif - else
语句
可以使用elseif
来添加更多的条件判断,当if
的条件为假时,会依次判断elseif
的条件,若都不满足,则执行else
后面的代码块。
x = 0;
if x > 0disp('x 是正数');
elseif x < 0disp('x 是负数');
elsedisp('x 是零');
end
此例中x
的值为0,不满足x > 0
和x < 0
的条件,所以会执行disp('x 是零');
语句。
4. 嵌套if
语句
在if
语句的代码块中还可以再嵌套if
语句,以实现更复杂的条件判断。
x = 10;
y = 5;
if x > 5if y > 3disp('x 大于 5 且 y 大于 3');end
end
在这个嵌套if
语句里,首先判断x > 5
,条件为真,接着进入内层if
语句,判断y > 3
,条件也为真,所以会执行disp('x 大于 5 且 y 大于 3');
语句。
总结来说,if
语句在MATLAB里是非常实用的条件控制结构,能依据不同的条件来执行不同的代码逻辑。
【例题】计算分段函数P46
x=input('请输入一个数:');
if x<0 y=abs(x);
elseif x<10y=sin(x)./(x+1);
elseif x<20y=pow(x,3);
else y=(3+2*x).*log(x);
end
disp(y);
第3节 不同类型的比较操作
在MATLAB中,==
、~=
、>
、<
、>=
、<=
分别用于不同类型的比较操作,下面为你详细介绍它们的语法和使用示例:
1. ==
(相等比较)
==
用于比较两个值或数组的对应元素是否相等,返回一个逻辑数组(若输入为数组)或一个逻辑标量(若输入为标量),相等的位置为 true
(即 1
),不相等的位置为 false
(即 0
)。
% 标量比较
a = 5;
b = 5;
result1 = a == b;
disp(result1);% 数组比较
A = [1, 2, 3];
B = [1, 4, 3];
result2 = A == B;
disp(result2);
2. ~=
(不等于比较)
~=
用于比较两个值或数组的对应元素是否不相等,同样返回一个逻辑数组或逻辑标量,不相等的位置为 true
,相等的位置为 false
。
% 标量比较
a = 5;
b = 6;
result3 = a ~= b;
disp(result3);% 数组比较
A = [1, 2, 3];
B = [1, 4, 3];
result4 = A ~= B;
disp(result4);
3. >=
(大于等于比较)
>=
用于比较两个值或数组的对应元素,判断左边的元素是否大于或等于右边的元素,返回的逻辑数组或逻辑标量中,满足条件的位置为 true
,不满足条件的位置为 false
。
% 标量比较
a = 5;
b = 3;
result5 = a >= b;
disp(result5);% 数组比较
A = [1, 2, 3];
B = [1, 4, 3];
result6 = A >= B;
disp(result6);
这些比较运算符在MATLAB的条件判断、数组筛选等操作中非常常用。例如,可以使用它们结合 if
语句来实现条件控制,或者结合逻辑索引来筛选数组中的元素。
第4节 switch语句
在MATLAB中,switch
语句是一种条件控制结构,用于根据表达式的值来选择执行不同的代码块,它可以替代多个嵌套的if-elseif-else
语句,使代码更加简洁易读。以下是switch
语句的详细语法和使用示例。
基本语法
switch expressioncase value1% 当 expression 的值等于 value1 时执行的代码statements1case value2% 当 expression 的值等于 value2 时执行的代码statements2...case valueN% 当 expression 的值等于 valueN 时执行的代码statementsNotherwise% 当 expression 的值不等于任何一个 case 值时执行的代码statements_otherwise
end
expression
:是一个表达式,其值将与各个case
后面的值进行比较。case value
:value
可以是标量、向量或字符串,当expression
的值与某个case
后面的值相等时,就会执行该case
下的代码块。otherwise
:是可选的,当expression
的值不等于任何一个case
后面的值时,会执行otherwise
下的代码块。
使用示例
示例1:根据数字选择执行不同的操作
x = 2;
switch xcase 1disp('x 的值是 1');case 2disp('x 的值是 2');case 3disp('x 的值是 3');otherwisedisp('x 的值不是 1、2 或 3');
end
在这个例子中,x
的值为2,所以会执行case 2
下的代码块,输出x 的值是 2
。
示例2:使用向量作为case
值
x = [1, 2];
y = [1, 2];
switch isequal(x, y)case truedisp('x 和 y 相等');case falsedisp('x 和 y 不相等');
end
这里使用isequal
函数比较x
和y
是否相等,返回一个布尔值。根据这个布尔值,选择执行相应的代码块。
示例3:处理多个值匹配的情况
x = 3;
switch xcase {1, 2}disp('x 的值是 1 或 2');case {3, 4}disp('x 的值是 3 或 4');otherwisedisp('x 的值不是 1、2、3 或 4');
end
在这个例子中,x
的值为3,所以会执行case {3, 4}
下的代码块,输出x 的值是 3 或 4
。
注意事项
switch
语句中的比较是严格相等的比较,即值和类型都要相同。- 一旦某个
case
条件满足,执行完该case
下的代码块后,会跳出switch
语句,不会继续检查后面的case
条件。 otherwise
分支可以省略,如果省略且没有匹配的case
条件,则不会执行任何代码。
for函数的使用
在MATLAB里,for
循环是用来重复执行特定代码块的控制结构,可按照指定的次数或者遍历数组元素来执行操作。下面详细介绍for
循环的常见使用方式。
1. 基于数值范围的for
循环
借助冒号运算符来指定循环变量的取值范围,格式为for 循环变量 = 起始值:步长:终止值
,若不指定步长,默认步长为1。
% 步长为1的情况
for i = 1:5fprintf('%d ',i);
end
fprintf("\n") %换行
% 指定步长为2的情况
for j = 1:2:10fprintf("%d ",j);
end%输出如下:
1 2 3 4 5
1 3 5 7 9
在第一个例子中,循环变量i
从1开始,每次增加1,直到达到5,循环体中使用disp
函数输出i
的值。
第二个例子里,循环变量j
从1开始,步长为2,直到达到10。
2. 使用end
关键字结束循环
在MATLAB里,for
循环必须以end
关键字结尾,以此来标识循环体的结束。若缺少end
,会导致语法错误。
总结而言,for
循环在MATLAB中是一种很有用的控制结构,能够根据需求实现不同的循环逻辑。
3. 遍历数组元素的for
循环
for
循环能直接遍历数组的每个元素。
A = [10, 20, 30, 40, 50];
for element = Adisp(element);
end
这里的A
是一个数组,循环变量element
会依次取数组A
中的每个元素,并将其输出。
4. 嵌套for
循环
可以在一个for
循环内部嵌套另一个for
循环,用于处理二维数组或者实现更复杂的逻辑。
for i = 1:3for j = 1:2result = i * j;fprintf('i = %d, j = %d, i * j = %d\n', i, j, result);end
end
在这个嵌套for
循环中,外层循环控制i
的值从1到3,内层循环控制j
的值从1到2,每次循环都会计算i
和j
的乘积并输出。
【例题1】对于三位数而言,若一个三位数的百位、十位、个位数字的立方和等于该数本身,那它就是水仙花数。输出100~999之间的水仙花数
num=[];
for i=100:999g=mod(i,10);s=mod(fix(i/10),10);b=fix(i/100);sum = power(g,3)+power(s,3)+power(b,3);if sum==inum = [num,sum]; %存入结果end
end
disp(num); %输出153 370 371 407
【例题2】若一个数等于它的各个真因子之和,则称该数为完数,如6=1+2+3,所以6是完数。求[1,100]
之间的全部完数。
for num=1:100 %1~100之间s=0;for i=1:num if num%i==0s = s + i; %将因子数相加if num==sfprintf('%d ',s);endendend
end
break
和continue
在MATLAB中,break
和continue
都是用于控制循环流程的关键字,它们在循环结构(如for
循环和while
循环)中发挥着不同的作用,下面为你详细介绍二者的区别。
1. break
语句
break
语句的主要作用是立即终止当前所在的循环,无论循环条件是否满足,程序都会跳出该循环,继续执行循环之后的代码。
示例代码
for i = 1:10if i == 5break;enddisp(i);
end
disp('循环已终止');
代码解释
在这个for
循环中,当变量i
的值等于5时,break
语句会被执行,循环会立即终止,不再执行后续的循环迭代。所以,代码只会输出1到4的数字,然后输出循环已终止
。
2. continue
语句
continue
语句用于跳过当前循环迭代中continue
语句之后的代码,直接进入下一次循环迭代。也就是说,它会忽略本次循环剩余的代码,但是循环会继续执行,直到循环条件不再满足。
示例代码
for i = 1:10if i == 5continue;enddisp(i);
end
disp('循环已结束');
代码解释
在这个for
循环中,当变量i
的值等于5时,continue
语句会被执行,disp(i);
语句会被跳过,直接进入下一次循环迭代。所以,代码会输出除5之外的1到10的数字,最后输出循环已结束
。
总结
break
:终止整个循环,跳出循环体,不再执行后续的循环迭代。continue
:跳过当前循环迭代中continue
语句之后的代码,直接进入下一次循环迭代,循环会继续执行。
在实际编程中,你可以根据具体的需求选择使用break
或continue
来控制循环的执行流程。
章节练习
第8章 符号计算
factor因式分解
在MATLAB中,factor
函数主要用于对整数进行分解质因数操作,下面为你详细介绍其语法及使用示例。
基本语法
F = factor(X)
- 输入参数:
X
:可以是一个标量整数、整数向量或者整数矩阵。当X
是向量或矩阵时,factor
函数会对其中的每个元素分别进行质因数分解。
- 输出参数:
F
:如果X
是标量整数,F
是一个包含X
的质因数的向量,这些质因数按升序排列。如果X
是向量或矩阵,F
是一个元胞数组,其中每个元胞对应X
中相应位置元素的质因数分解结果。
使用示例
对标量整数进行质因数分解
X = 24;
F = factor(X);
disp(F);
在这个例子中,factor
函数会将整数 24
分解为质因数,结果存储在向量 F
中。运行代码后,你会看到输出为 2 2 2 3
,这表明 24 = 2 × 2 × 2 × 3
。
对整数向量进行质因数分解
X = [12, 15];
F = factor(X);
disp(F);
当输入是一个向量时,factor
函数会对向量中的每个元素分别进行质因数分解,并将结果存储在元胞数组 F
中。对于这个例子,F{1}
是 12
的质因数分解结果 2 2 3
,F{2}
是 15
的质因数分解结果 3 5
。
对整数矩阵进行质因数分解
X = [16, 18; 20, 22];
F = factor(X);
disp(F);
这里输入是一个矩阵,factor
函数会对矩阵中的每个元素进行质因数分解,结果存储在元胞数组 F
中。F
中的每个元胞对应矩阵 X
中相应位置元素的质因数分解结果。
需要注意的是,factor
函数的输入必须是整数。如果输入为非整数,MATLAB 会给出错误提示。
% 1、定义xyz
syms x y z
% 2、factor(公式)
f1 = factor(x^9 - 1);
disp('1) 分解结果为:');
disp(f1);
limit求极限
在MATLAB里,limit
函数主要用于计算符号表达式的极限。下面为你详细介绍它的语法和使用示例。
基本语法
1. limit(f, x, a)
此语法用于计算符号表达式f
在变量x
趋近于a
时的极限。
syms x;
f = (x^2 - 1)/(x - 1);
a = 1;
L = limit(f, x, a);
disp(L);
在这个例子中,我们先定义了符号变量x
,接着定义了符号表达式f
,最后计算当x
趋近于1时f
的极限。运行代码后,会输出极限值2。
2. limit(f, a)
若符号表达式f
中只有一个符号变量,那么可以省略变量名,直接使用此语法计算该符号表达式在该变量趋近于a
时的极限。
syms t;
f = sin(t)/t;
a = 0;
L = limit(f, a);
disp(L);
这里定义了符号变量t
和符号表达式f
,然后计算当t
趋近于0时f
的极限,输出结果为1。
3. limit(f, x, a, 'right')
此语法用于计算符号表达式f
在变量x
从右侧趋近于a
时的极限(右极限)。
syms x;
f = 1/x;
a = 0;
L = limit(f, x, a, 'right');
disp(L);
运行该代码后,会得到f
在x
从右侧趋近于0时的极限,结果为Inf
(正无穷)。
4. limit(f, x, a, 'left')
此语法用于计算符号表达式f
在变量x
从左侧趋近于a
时的极限(左极限)。
syms x;
f = 1/x;
a = 0;
L = limit(f, x, a, 'left');
disp(L);
运行代码后,会得到f
在x
从左侧趋近于0时的极限,结果为-Inf
(负无穷)。
注意事项
- 要使用
limit
函数,需要先使用syms
函数定义符号变量。 - 当极限不存在时,
limit
函数可能返回NaN
(非数字)或者给出一个未定义的结果。
syms x
% (1)lim (x→4) (x^2 -6x +8)/(x^2 -5x +4)
limit1 = limit((x^2 - 6*x + 8)/(x^2 -5*x + 4), x, 4);
disp('(1)极限为:');
disp(limit1);
% (2)lim (x→0⁻) |x|/x
limit2 = limit(abs(x)/x, x, 0, 'left');
disp('(2)极限为:');
disp(limit2);
diff求导
在MATLAB中,diff
函数主要用于计算数值差分,而对于符号表达式求导,需要使用diff
函数结合符号工具箱。下面分别介绍数值差分和符号求导的语法及使用示例。
1. 数值差分
diff
函数用于计算向量或矩阵的差分。
语法
Y = diff(X)
Y = diff(X,n)
Y = diff(X,n,dim)
- 参数说明:
X
:输入的向量或矩阵。n
:可选参数,指定差分的阶数,默认为1。dim
:可选参数,指定沿哪个维度进行差分,对于向量,该参数可忽略;对于矩阵,dim = 1
表示沿列方向差分,dim = 2
表示沿行方向差分。
- 示例:
% 向量差分
x = [1, 3, 6, 10];
dy = diff(x);
disp(dy);% 二阶差分
d2y = diff(x, 2);
disp(d2y);% 矩阵差分
A = [1, 2, 3; 4, 5, 6];
dy_col = diff(A, 1, 1); % 沿列方向一阶差分
dy_row = diff(A, 1, 2); % 沿行方向一阶差分
disp(dy_col);
disp(dy_row);
2. 符号求导
使用diff
函数结合符号工具箱可以对符号表达式进行求导。
语法
Y = diff(f)
Y = diff(f, var)
Y = diff(f, var, n)
- 参数说明:
f
:输入的符号表达式。var
:可选参数,指定对哪个符号变量求导,若省略,则对默认的符号变量求导。n
:可选参数,指定求导的阶数,默认为1。
- 示例:
% 定义符号变量
syms x;% 定义符号表达式
f = x^3 + 2*x^2 + 3*x + 4;% 对默认变量 x 求一阶导数
df = diff(f);
disp(df);% 对指定变量 x 求二阶导数
d2f = diff(f, x, 2);
disp(d2f);
总结
diff
函数用于数值差分,计算向量或矩阵元素之间的差值。- 结合符号工具箱,
diff
函数可以对符号表达式进行求导。在使用符号求导时,需要先使用syms
函数定义符号变量。
syms x
% 定义函数 y
y = sin(x) - x^2 / 2;
% 求一阶导数 y'
y_prime = diff(y, x);
disp('一阶导数 y'' 为:');
disp(y_prime);
% 求二阶导数 y''
y_double_prime = diff(y, x, 2);
disp('二阶导数 y'''' 为:');
disp(y_double_prime);
% 求三阶导数 y'''
y_double_prime = diff(y, x, 3);
disp('三阶导数 y'''''' 为:');
disp(y_double_prime);
求非线性方程组的符号解
在MATLAB里,有多种方法可以求解非线性方程组,下面为你介绍两种常用的函数及其语法和使用示例。
1. fsolve
函数
fsolve
函数是MATLAB中用于求解非线性方程组的常用函数,它采用数值方法寻找方程组的根。
基本语法
x = fsolve(fun,x0)
x = fsolve(fun,x0,options)
- 参数说明:
fun
:表示一个函数句柄,该函数用于定义非线性方程组。此函数接收一个向量输入,返回一个包含方程组中每个方程计算结果的向量。x0
:是初始猜测值向量,也就是求解方程组时的起始点。合适的初始猜测值对求解结果和收敛速度有重要影响。options
:是可选参数,为优化选项结构体,可用于设置求解过程中的各种参数,例如最大迭代次数、误差容限等。
使用示例
假设要求解如下非线性方程组:
[
\begin{cases}
x_1^2 + x_2^2 - 1 = 0 \
x_1 - x_2^2 = 0
\end{cases}
]
% 定义非线性方程组的函数
function F = myfun(x)F(1) = x(1)^2 + x(2)^2 - 1;F(2) = x(1) - x(2)^2;
end% 初始猜测值
x0 = [0.5; 0.5];% 调用 fsolve 函数求解方程组
x = fsolve(@myfun, x0);% 显示求解结果
disp('方程组的解为:');
disp(x);
2. vpasolve
函数
vpasolve
函数是符号工具箱中的函数,可用于求解符号形式的非线性方程组,它能给出符号解或数值近似解。
基本语法
sol = vpasolve(eqns,vars)
sol = vpasolve(eqns,vars,init_guess)
- 参数说明:
eqns
:是一个符号表达式或符号表达式向量,用于定义非线性方程组。vars
:是一个符号变量或符号变量向量,代表方程组中的未知变量。init_guess
:是可选参数,为初始猜测值,可帮助求解器更快地收敛到解。
使用示例
同样求解上述非线性方程组:
% 定义符号变量
syms x1 x2;% 定义非线性方程组
eqns = [x1^2 + x2^2 - 1 == 0, x1 - x2^2 == 0];% 定义未知变量
vars = [x1, x2];% 调用 vpasolve 函数求解方程组
sol = vpasolve(eqns, vars);% 显示求解结果
disp('方程组的解为:');
disp(sol.x1);
disp(sol.x2);
总结
fsolve
函数是数值求解器,需要将方程组定义为函数句柄,并且要提供初始猜测值。vpasolve
函数是符号求解器,使用符号表达式定义方程组,可给出符号解或数值近似解,也可提供初始猜测值来加速求解过程。
syms x y z
% 方程组 (1)
eq1_1 = log(x/y) == 9;
eq1_2 = exp(x + y) == 3;
solution1 = solve([eq1_1, eq1_2], [x, y]);
x1 = solution1.x;
y1 = solution1.y;
disp('方程组 (1) 的解为:');
disp(['x = ', char(x1)]);
disp(['y = ', char(y1)]);
% 方程组 (2)
eq2_1 = (4*x^2)/(4*x^2 + 1) == y;
eq2_2 = (4*y^2)/(4*y^2 + 1) == z;
eq2_3 = (4*z^2)/(4*z^2 + 1) == x;
solution2 = solve([eq2_1, eq2_2, eq2_3], [x, y, z]);
x2 = solution2.x;
y2 = solution2.y;
z2 = solution2.z;
disp('方程组 (2) 的解为:');
for i = 1:length(x2)disp(['解 ', num2str(i), ':']);disp(['x = ', char(x2(i))]);disp(['y = ', char(y2(i))]);disp(['z = ', char(z2(i))]);
end
利用符号表达式求z
syms x y
% 定义符号常数 x 和 y
x = sym('6');
y = sym('5');
% 定义表达式 z
z = (x + 1) / (sqrt(3 + x) - sqrt(y));
% 计算 z 的值
result = vpa(z);
disp(result);syms a b
a=6;
b=5;
z = (a + 1) / (sqrt(3 + a) - sqrt(b));
disp(z);
化简表达式
在MATLAB里,能借助符号工具箱对表达式进行化简,下面为你介绍几个常用的化简函数及其语法与示例。
1. simplify
函数
simplify
函数是一个通用的化简函数,它能尝试运用多种规则对符号表达式进行化简。
语法
R = simplify(S)
- 参数说明:
S
:输入的符号表达式。R
:化简后的符号表达式。
示例
% 定义符号变量
syms x;% 定义符号表达式
S = (x^2 - 1)/(x - 1);% 化简表达式
R = simplify(S);% 显示化简结果
disp(R);
此例中,simplify
函数把表达式 (x^2 - 1)/(x - 1)
化简为 x + 1
。
2. expand
函数
expand
函数主要用于展开表达式,像多项式展开、三角函数展开等。
语法
R = expand(S)
- 参数说明:
S
:输入的符号表达式。R
:展开后的符号表达式。
示例
% 定义符号变量
syms x;% 定义符号表达式
S = (x + 1)^2;% 展开表达式
R = expand(S);% 显示展开结果
disp(R);
在这个例子中,expand
函数把表达式 (x + 1)^2
展开为 x^2 + 2*x + 1
。
3. factor
函数
factor
函数用于对多项式进行因式分解。
语法
R = factor(S)
- 参数说明:
S
:输入的符号表达式,通常是多项式。R
:因式分解后的符号表达式。
示例
% 定义符号变量
syms x;% 定义符号表达式
S = x^2 - 1;% 因式分解表达式
R = factor(S);% 显示因式分解结果
disp(R);
这里,factor
函数把表达式 x^2 - 1
因式分解为 (x - 1)*(x + 1)
。
4. collect
函数
collect
函数可将表达式按照指定变量的幂次进行合并同类项。
语法
R = collect(S,v)
- 参数说明:
S
:输入的符号表达式。v
:指定的变量。R
:合并同类项后的符号表达式。
示例
% 定义符号变量
syms x;% 定义符号表达式
S = x^2 + 3*x + 2*x^2;% 按 x 的幂次合并同类项
R = collect(S,x);% 显示合并结果
disp(R);
此例中,collect
函数把表达式 x^2 + 3*x + 2*x^2
合并为 3*x^2 + 3*x
。
在使用这些函数之前,要先运用syms
函数定义符号变量。并且,不同的化简函数适用于不同的场景,你可以依据表达式的特点选择合适的函数。
syms beta1 beta2 x
% (1)化简 sin(beta1)*cos(beta2) - cos(beta1)*sin(beta2)
expr1 = sin(beta1)*cos(beta2) - cos(beta1)*sin(beta2);
simplified_expr1 = simplify(expr1);
disp('(1)化简结果为:');
disp(simplified_expr1);
% (2)化简 (4x^2 + 8x + 3)/(2x + 1)
expr2 = (4*x^2 + 8*x + 3)/(2*x + 1);
simplified_expr2 = simplify(expr2);
disp('(2)化简结果为:');
disp(simplified_expr2);