在線編譯器 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);