数学建模之MATLAB编程
EverydayOneCat
🌈 🐱🐱🐱
🍣🍣🍣🍣🍣??N
🌈📖📜 🥢
🐱 🐱
「Sushi shop!」
知識點
1.下載
鏈接:https://pan.baidu.com/s/1DbfysOOwIoSvt8HQUw0jhw
提取碼:75mz
2.基本數學運算
2.1變量與數據操作
變量定義注意事項:
- 變量名區分字母大小寫
- 變量名必須以字母開頭,之后可以是任意字母、數字或下劃線
- MATLAB語言將所識別的一切變量視為局部變量,若要將變量定義為全局變量,則應當對變量進行說明,即在該變量前加關鍵字global.
特殊變量表:
| ans | 用于結果的缺省變量名 |
| pi | 圓周率 |
| eps | 計算機的最小數 |
| flops | 浮點運算數 |
| inf | 無窮大 如1/0 |
| nan | 不等量 如0/0 |
| i j | i=j=虛數單位 |
| nargin | 函數的輸入變量數目 |
| nargout | 函數的輸出變量數目 |
| realmin | 最小的可用正實數 |
| realmax | 最大的可用正實數 |
2.2MATLAB常用數學函數
MATLAB 提供了許多數學函數,函數的自變量規定為矩陣變量,運算法則是將函數逐項作用于矩陣的元素上,因而運算的結果是一個與自變量同維數的矩陣。
1.基本數學函數:
abs(x):純量的絕對值或向量的長度
angle(z):復數z的相角**(Phase angle) sqrt(x):開平方 real(z):復數z**的實部
imag(z):復數z的虛部
conj(z):復數z的共軛復數
round(x):四舍五入至最近整數
fix(x):無論正負,舍去小數至最近整數
floor(x):地板函數,即舍去正小數至最近整數
ceil(x):天花板函數,即加入正小數至最近整數
rat(x):將實數x化為分數表示
rats(x):將實數x化為多項分數展開
rem(x,y):求x除以y的余數
gcd(x,y):整數x和y的最大公因數
lcm(x,y):整數x和y的最小公倍數
exp(x):自然指數
pow2(x):2的指數
log(x):以e為底的對數,即自然對數
log2(x):以2為底的對數
log10(x):以10為底的對數
sign(x):符號函數 (Signum function).
2.三角函數:
sin(x):正弦函數 cos(x):余弦函數
tan(x):正切函數 asin(x):反正弦函數
acos(x):反余弦函數 atan(x):反正切函數
atan2(x,y):四象限的反正切函數 sinh(x):超越正弦函數
cosh(x):超越余弦函數 tanh(x):超越正切函數
asinh(x):反超越正弦函數 acosh(x):反超越余弦函數atanh(x):反超越正切函數
3.適用于向量的常用函數:
min(x): 向量x的元素的最小值 max(x): 向量x的元素的最大值
mean(x): 向量x的元素的平均值 median(x): 向量x的元素的中位數
std(x): 向量x的元素的標準差 diff(x): 向量x的相鄰元素的差
sort(x): 對向量x的元素進行排序(Sorting) length(x): 向量x的元素個數
norm(x): 向量x的歐氏長度 sum(x): 向量x的元素總和
prod(x): 向量x的元素總乘積 cumsum(x): 向量x的累計元素總和
cumprod(x): 向量x的累計元素總乘積 dot(x, y): 向量x和y的內積
cross(x, y): 向量x和y的外積
+++
例:隨機抽取10 名學生的高等數學課程成績,并統計他們中的最高分、最低分以及他們的平均成績。
>> math=[88,90,77,69,92,80,74,66,95,85]; %產生10維向量 mathaver=sum(math)/10 %計算平均成績 h=max(math) %求出最高分 l=min(math) %求出最低分2.3MATLAB矩陣
矩陣的建立:
(1)直接輸入法——A=[1 2 3;4 5 6;7 8 9]
矩陣同行元素之間由空格或逗號分隔,行與行之間用分號或回車鍵分隔;若“[ ]”中無元素表示空矩陣.
(2)利用冒號和函數——函數linspace(a,b,n)產生第一個元素為a,最后一個元素為b總數為n的行向量
>> a=1:0.5:4 % 格式是初始值:步長:終止值 a= Columns 1 through 7 1 1.5 2 2.5 3 3.5 4(3)矩陣合并
>> B=[1 1 1] B = 1 1 1 >> C=[A;B] %分號增加行 C = 1 2 3 4 5 6 7 8 9 1 1 1 >> D=[A,B'] %逗號增加列 D = 1 2 3 1 4 5 6 1 7 8 9 1矩陣的截取:
(1) 矩陣元素
>> A(2,3) %下標引用 ans = 6 >> A(6) %一列一列的開始數 ans = 8序號(Index)與下標(Subscript )是一一對應的,其相互轉換關系也可利用sub2ind和ind2sub函數求得。
>> sub2ind(size(A),2,3) ans= 8 [i,j]=ind2sub(size(A),8) i= 2 j= 3(2) 使用冒號
可以用冒號表示“直到”以及“所有行”,“所有列”,還可利用一般向量和end運算符來表示矩陣下標,從而獲得子矩陣。end表示某一維的末尾元素下
>> B=A (1:2, : ) %逗號前面是行數,表示第一行直到第二行;逗號后面列數,表示所有列 B= 1 2 3 4 5 6 >> C=A([1,3],2:end) %行數:第一行和第三行;列數:第二列直到最后 C = 2 3 8 9+++
特殊矩陣:
| ones(m,n) | 生成一個 m 行 n 列的元素全為 1 的矩陣, m=n 時可寫為 ones(n) |
| eye(m,n) | 生成一個主對角線全為 1 的 m 行 n 列矩陣, m=n 時可簡寫為 eye(n),即為 n 維單位矩陣 |
| diag(X) | 若 X 是矩陣,則 diag(X) 為 X 的主對角線向量 若 X 是向量,diag(X) 產生以 X 為主對角線的對角矩陣 |
| tril(A) | 提取一個矩陣的下三角部分 |
| triu(A) | 提取一個矩陣的上三角部分 |
| rand(m,n) | 產生 0~1 間均勻分布的隨機矩陣 m=n 時簡寫為 rand(n) |
| randn(m,n) | 產生均值為0,方差為1的標準正態分布隨機矩陣 m=n 時簡寫為 randn(n) |
例:
分別建立3×3、3×2和與矩陣A同樣大小的零矩陣。
>> zeros(3),zeros(3,2),zeros(size(A))建立隨機矩陣:
(1) 在區間[20,50]內均勻分布的5階隨機矩陣。
(2) 均值為0.6、方差為0.1的5階正態分布隨機矩陣。
3.MATLAB運算
3.1基本算術運算
MATLAB的基本算術運算有:+(加)、-(減)、*(乘)、/(右除)、\ (左除)、^(乘方)。
這個就是矩陣的乘法,線性代數知識:m* n的矩陣只有和n *x的矩陣才能相乘得出m *x的矩陣。(老湯別打我,我只記得這個了😥)
3.2點運算
在MATLAB中,有一種特殊的運算,因為其運算符是在有關算術運算符前面加點,所以叫點運算。
點運算符有:
點乘: .*
點除: ./ .
點冪: .^
兩矩陣進行點運算是指它們的對應元素進行相關運算,要求兩矩陣的維數相同。
>> A.^2 ans = 1 4 9 16 25 36 49 64 81| = = | 等于 | 關系運算符 |
| ~ = | 不等于 | |
| < | 小于 | |
| > | 大于 | |
| <= | 小于等于 | |
| >= | 大于等于 | |
| & | 邏輯與 | 邏輯運算符 |
| | | 邏輯或 | |
| ~ | 邏輯非 |
例:
產生5階隨機方陣A,其元素為[10,90]區間的隨機整數,然后判斷A的元素是否能被3整除。
>> A=fix((90-10+1)*rand(5)+10) %生成5階隨機方陣A P=rem(A,3)==0 %判斷結果是一個布爾矩陣fix()取整;rand生成0~1的隨機方陣;rem(A,B)——A/B的余數
建立矩陣A,然后找出大于4的元素的位置。
>> A=[4,-65,-54,0,6;56,0,67,-45,0] find(A>4) %返回的是索引值3.3矩陣分析
用求逆矩陣的方法解線性方程組。備注:Ax=b其解為:x=A-1b
>> a=[2,-3,1;8,3,2;45,1,-9]; b=[4;2;17]; x=inv(a)*b用求特征值的方法解方程:
3x5?7x4+5x2+2x?18=03x^5-7x^4+5x^2+2x-18=0 3x5?7x4+5x2+2x?18=0
4.MATLAB程序設計
4.1M文件
所謂M文件就是由MATLAB語言編寫的可在MATLAB語言環境下運行程序源代碼文件。
M文件可以根據調用方式的不同分為兩類:
命令文件(Script File):自動重復執行的一組MATLAB命令和函數組合,不需輸出輸入參數。
函數文件(Function File):M文件的第一個可執行以function開始,便是函數文件,每一個函數文件定義一個函數。
例一:分別建立命令文件和函數文件,將華氏溫度f轉換為攝氏溫度c。
命令文件:
clear; %清除工作空間中的變量 f=input('temperature:'); c=5*(f-32)/9函數文件:
function c=demo2(f) c=5*(f-32)/9;命令窗口輸入:
>> c=f2c_fun(20) c = -6.6667注意:函數只能調用,不能直接運行,函數調用的一般格式是:[輸出實參表]=函數名(輸入實參表)實參傳遞給形參
同時,如果需要測試多個變量,只有函數才能實現。
>> f=[20,73];c=demo2(f) c = -6.6667 22.7778+++
例二:編寫函數文件求半徑為r的圓的面積和周長。
編寫函數文件:
function [s,p]=demo3(r) %r 圓半徑 %s 圓面 %p 圓周長 s=pi*r*r; p=2*pi*r;我們這里計算半徑為2和3的面積和周長,命令行輸入:
>> r=[2,3];[s,p]=demo3(r) 錯誤使用 * 用于矩陣乘法的維度不正確。請檢查并確保第一個矩陣中的列數與第二個矩陣中的行數匹配。要執行按元素相乘,請使用 '.*'。出錯 demo3 (line 5) s=pi*r*r;發現出錯,根據提示我們發現需要用點乘才能計算
%s=pi*r*r; s=pi*r.*r; >> r=[2,3];[s,p]=demo3(r) s = 12.5664 28.2743 p = 12.5664 18.84964.2輸入輸出
數據的輸入
從鍵盤輸入數據:A=input(‘提示信息’,‘s’);加上‘s’選項,則允許用戶輸入一個字符串。
disp(輸出項)——其中輸出項既可以為字符串,也可以為矩陣。
求一元二次方程ax2 +bx+c=0的根。
>> a=input('a=?'); b=input('b=?'); c=input('c=?'); d=b*b-4*a*c; x=[(-b+sqrt(d))/(2*a),(-b-sqrt(d))/(2*a)];%sqrt——平方根 disp(['x1=',num2str(x(1)),',x2=', num2str(x(2))]);%num2str——數字轉為字符串 a=?1 b=?3 c=?2 x1=-1,x2=-24.3選擇結構
4.3.1if語句:
例一:
隨機變量x = {0,1,2}表示每分鐘到達超市收款臺的人數,有分布列
| pk | 0.4 | 0.3 | 0.3 |
模擬十分鐘內顧客到達收款臺的狀況.
r=rand(1,10);%生成10個0~1隨機數,代表每分鐘來人的pk for i=1:10if r(i)<0.4n(i)=0;elseif 0.4<r(i)&r(i)<0.7n(i)=1;elsen(i)=2;end end r n>> demo5 r =0.7060 0.0318 0.2769 0.0462 0.0971 0.8235 0.6948 0.3171 0.9502 0.0344 n =2 0 0 0 0 2 1 0 2 04.3.2switch語句:
例二:
某商場對顧客所購買的商品實行打折銷售,標準如下(商品價格用price來表示):
price<200 沒有折扣
200≤price<500 3%折扣
500≤price<1000 5%折扣
1000≤price<2500 8%折扣
2500≤price<5000 10%折扣
5000≤price 14%折扣
輸入所售商品的價格,求其實際銷售價格。
num2cell函數:num2cell(A)是把A中的每一個元素作為cell的元素,這樣每個元素是一個數;
4.3.3for語句
其中表達式1 的值為循環變量的初值,表達式2的值為步長,表達式3的值為循環變量的終值。步長為1時,表達式2可以省略。
執行過程是依次將矩陣的各列元素賦給循環變量,然后執行循環體語句,直至各列元素處理完畢。
例三:
y=0; n=100; for i=1:ny=y+1/(2*i-1); end y寫出下列程序的執行結果
>> s=0; a=[12,13,14;15,16,17;18,19,20;21,22,23]; for k=a s=s+k; end disp(s');這里是一行一行累加的。
4.3.4while語句
while語句的一般格式為:
其執行過程為:若條件成立,則執行循環體語句,執行后再判斷條件是否成立,如果不成立則跳出循環。
break:跳出整個循環
continue:跳出當前循環
例四:
從鍵盤輸入若干個數,當輸入0時結束輸入,求這些數的平均值和它們之和。
>> sum=0; cnt=0; val=input('Enter a number (end in 0):'); while (val~=0) sum=sum+val; cnt=cnt+1; val=input('Enter a number (end in 0):'); end if (cnt > 0) sum mean=sum/cnt end求[100,200]之間第一個能被21整除的整數。
>> for n=100:200 if rem(n,21)~=0 continue end break end n4.3.5循環的嵌套
若一個數等于它的各個真因子之和,則稱該數為完數,如6=1+2+3,所以6是完數。求[1,500]之間的全部完數。
for m=1:500s=0;for k=1:m/2if rem(m,k)==0s=s+k;endendif m==sdisp(m);end end4.4極限
(1) limit(f,x,a):計算當變量x趨近于常數a時,f(x)函數的極限值;
(2) limit(f,x,a,‘right’):‘right’表示變量x從右邊趨近于a;
(3) limit(f,x,a,‘left’): ‘left’表示變量x從左邊趨近于a
注:正無窮,則可以用+inf
例:
syms x; %定義變量x limit(1/x^2-cot(x)^2,x,0) ans=2/3 syms a,b,x; limit((sin(a/x^2)+cos(b/x))^(x^2),x,inf) ans=exp(a-1/2*b^2) syms x; limit(x^x,x,0,'right') ans=1 syms t,x; limit((1+2*t/x)^(3*x),x,inf) ans = exp(6*t)4.5代數方程(組)的解
4.6導數
diff(f,x):以x為自變量,對符號表達式f求一階導數;
diff(f,x,n):以x為自變量,對符號表達式f求n階導數。
syms x; y='x*exp(3*x)'; y1=diff(str2sym(y),x); % 1階導數 y5=diff(str2sym(y),x,5); % 5階導數 y1,y5 syms x y=log(x+sqrt(1+x^2)); y1=diff(y,x); % 1階導數 y2=diff(y,x,2); % 2階導數 simplify(y1),simplify(y2)%結果化簡ans =1/(1+x^2)^(1/2) ans =-x/(1+x^2)^(3/2)這里需要留意:新版本化簡用simplify函數
4.7函數極值
(1) fminbnd(f,x1,x2)——求函數f在區間[x1,x2]上的極小值;
(2) fminsearch(‘f’,x0)——求多元函數f在x0附近的極小值
畫圖:
syms x; f='x*cos(x)'; %定義函數f fplot(f,[-8,8]) grid; %顯示網格用fminbnd函數求極小值:
[X,FVAL] = fminbnd(f,-8,8) X = 3.4256 FVAL = -3.2884 [X,FVAL] = fminbnd(f,-8,0) X = -6.4373 FVAL = -6.3610 [X,FVAL] = fminbnd(f,-4,0) X = -0.8603 FVAL = -0.5611用fminsearch函數求極小值:
[X,FVAL] = fminsearch (f,2) X = 3.4256 FVAL = -3.2884 [X,FVAL] = fminsearch (f,-4) X = -6.4373 FVAL = -6.3610 [X,FVAL] = fminsearch (f,-2) X = -0.8603 FVAL = -0.56114.8積分的計算
int(f,x):以x為自變量,對被積函數或符號表達式f求不定積分;
int(f,x,a,b):求定積分運算。a,b分別表示定積分的下限和上限。該函數求被積函數在區間[a,b]上的定積分。
注意:在所求結果后加常數運行結果如下:
ans=?1/2?cos(2?x)+s2?xans = -1/2*cos(2*x)+s^2*x ans=?1/2?cos(2?x)+s2?x
4.9微分方程求解
Dy表示y’ ;
D2y表示y ’ ‘;
Dy(0)=5表示y’ (0)=5
dsolve(‘f’,’c’,’v’):這個命令包括三部分,微分方程,初始條件,指定變量。
dsolve(‘Dy=1+y^2’) % 求一階方程的通解 ans =tan(t+C1) % C1為積分常數。 dsolve('Dy=1+y^2', 'y(0)=1') % 求特解 ans =tan(t+1/4*pi)4.10線性代數運算
矩陣的轉置
轉置運算符是單撇號(’)。
矩陣的旋轉
利用函數rot90(A,k)將矩陣A旋轉90o的k倍,當k為1時可省略。
矩陣的左右翻轉
對矩陣實施左右翻轉是將原矩陣的第一列和最后一列調換,第二列和倒數第二列調換,…,依次類推。MATLAB對矩陣A實施左右翻轉的函數是fliplr(A)。
矩陣的上下翻轉
MATLAB對矩陣A實施上下翻轉的函數是flipud(A)。
矩陣的逆
對于一個方陣A,如果存在一個與其同階的方陣B,使得:A·B=B·A=I (I為單位矩陣)則稱B為A的逆矩陣,當然,A也是B的逆矩陣。
求一個矩陣的逆是一件非常煩瑣的工作,容易出錯,但在MATLAB中,求一個矩陣的逆非常容易。
求方陣A的逆矩陣可調用函數inv(A)。
方陣的行列式
把一個方陣看作一個行列式,并對其按行列式的規則求值,這個值就稱為矩陣所對應的行列式的值。
在MATLAB中,求方陣A所對應的行列式的值的函數是det(A)。
矩陣的秩與跡
1)矩陣的秩
矩陣線性無關的行數與列數稱為矩陣的秩。在MATLAB中,求矩陣秩的函數是rank(A)。
2) 矩陣的跡
矩陣的跡等于矩陣的對角線元素之和,也等于矩陣的特征值之和。在MATLAB 中,求矩陣的跡的函數是trace(A)。
矩陣的特征值與特征向量
在MATLAB中,計算矩陣A 的特征值和特征向量的函數是eig(A),常用的調用格式有3種:
(1) E=eig(A):求矩陣A 的全部特征值,構成向量E。
(2) [V,D]=eig(A):求矩陣A的全部特征值,構成對角陣D,并求A的特征向量構成V的列向量。
(3) [V,D]=eig(A,‘nobalance’):與第2種格式類似,但第2種格式中先對A作相似變換后求矩陣A的特征值和特征向量,而格式3直接求矩陣A的特征值和特征向量。
編程訓練
分段函數
根據我國個人所得稅計算方法,編制程序,要求:使用者在系統提示下通過鍵盤輸入月工資薪金收入總數,計算機則在屏幕上顯示個人所得稅額,界面友好,方便使用
個人所得稅計算方法:
月個人所得稅=(月工資薪金收入-2000)*適用稅率-速算扣除數
附表:個人所得稅稅率表(工資、薪金所得適用)
| 1 | 不超過500元的 | 5% | 0 |
| 2 | 超過500元至2000元的部分 | 10% | 25 |
| 3 | 超過2000元至5000元的部分 | 15% | 125 |
| 4 | 超過5000元至20000元的部分 | 20% | 375 |
| 5 | 超過20000元至40000元的部分 | 25% | 1375 |
| 6 | 超過40000元至60000元的部分 | 30% | 3375 |
| 7 | 超過60000元至80000元的部分 | 35% | 6375 |
| 8 | 超過80000元至100000元的部分 | 40% | 10375 |
| 9 | 超過100000元的部分 | 45% | 15375 |
編寫Matlab命令文件:
wages=input('請輸入您的工資:'); wage=wages-2000; if(wage<=0)tax=0; elseif(wage<=500)tax=wage*0.05; elseif(wage<=2000)tax=500*0.05+(wage-500)*0.1-25; elseif(wage<=5000)tax=500*0.05+1500*0.1+(wage-2000)*0.15-25-125; elseif(wage<=20000)tax=500*0.05+1500*0.1+3000*0.15+(wage-5000)*0.2-25-125-375; elseif(wage<=40000)tax=500*0.05+1500*0.1+3000*0.15+15000*0.2+(wage-20000)*0.25-25-125-375-1375; elseif(wage<=60000)tax=500*0.05+1500*0.1+3000*0.15+15000*0.2+20000*0.25+(wage-40000)*0.3-25-125-375-1375-3375; elseif(wage<=80000)tax=500*0.05+1500*0.1+3000*0.15+15000*0.2+20000*0.25+20000*0.3+(wage-60000)*0.35-25-125-375-1375-3375-6375; elseif(wage<=100000)tax=500*0.05+1500*0.1+3000*0.15+15000*0.2+20000*0.25+20000*0.3+20000*0.35+(wage-80000)*0.4-25-125-375-1375-3375-6375-10375; elsetax=500*0.05+1500*0.1+3000*0.15+15000*0.2+20000*0.25+20000*0.3+20000*0.35+20000*0.4+(wage-100000)*0.45-25-125-375-1375-3375-6375-10375-15375; end tax素數
求[2,999]中同時滿足下列條件的數
(1)該數各位數字之和為奇數
(2)該數是素數
運行結果得出以下的數:
3 5 7 23 29 41 43 47 61 67 83 89 113 131 137 139 151 157 173 179 191
193 197 199 223 227 229 241 263 269 281 283 311 313 317 331 337 353
359 373 379 397 401 409 421 443 449 461 463 467 487 557 571 577 593
599 601 607 641 643 647 661 683 719 733 739 751 757 773 797 809 821
823 827 829 863 881 883 887 911 919 937 953 971 977 991 997
水仙花數
水仙花數是指一個3位自然數,其各位數字的立方和等于該數本身,輸出1000以內的水仙花數,并求其個數。
y=[];%空矩陣 count=0; for i=100:999a=rem(i,10);b=rem(fix(i/10),10);c=fix(i/100);if(a^3+b^3+c^3==i)y=[y,i];%不斷擴充count=count+1;end end y,count突變素數
當一個素數(只有兩個正因數(1和自己)的自然數即為素數)與其前一個素數的差值大于等于5時,將其稱之為“突變素數”(2不是“突變素數”),求10000以內的“突變素數”的個數.
y=[]; k=0; count=0; for i=1:10000if isprime(i)==1if (i-k)>=5 y=[y,i];count=count+1;endk=i;end end y,count結果:count=820
方差分析1
試驗3種豬飼料的飼養效果,得到9頭豬的增重(單位:kg)如下:
用MATLAB編程做作方差分析,估計各個總體的未知參數μi和μ。(不允許用anova1工具箱)
先用SAS得到結果方便后面檢驗:
data ex; do a=1 to 3;input n@@; do i=1 to n;input x@@; output;end;end; cards; 4 51 40 43 48 3 23 25 26 2 23 28 ; proc anova data=ex;class a;model x=a; run;SST——(每個因素的均值-總均值)^2的和
SSA——每個水平的個數*(每個水平的均值-總均值)^2的和
SSE=SST-SSA
F=(SSA/(R-1))/(SSE/(n-R)) R為水平個數
可以看出和SAS所得結果一樣
方差分析2
測定4種種植密度下金皇后玉米的千粒重(單位:g)如下:
用MATLAB編程做作方差分析,估計各個總體的未知參數mI和μ。(不允許用anova1工具箱)
首先還是用SAS做出結果方便檢驗:
data ex; do a=1 to 4;input n@@; do i=1 to n;input x@@; output;end;end; cards; 4 247 258 256 251 4 238 244 246 236 4 214 227 221 218 4 210 204 200 210 ; proc anova data=ex;class a;model x=a; run;編寫Matlab代碼:
a=[247,258,256,251 238,244,246,236 214,227,221,218 210,204,200,210]; [m,n]=size(a); sst=0; for i=1:mfor j=1:nsst=sst+(a(i,j)-mean(a(:)))^2;end end ssa=0; for i=1:mfor j=1:nssa=ssa+(mean(a(i,:))-mean(a(:)))^2;end end sse=0; for i=1:mfor j=1:nsse=sse+(a(i,j)-mean(a(i,:)))^2;end end f=(ssa/m-1)/(sse/(m*n-n)); p=1-fcdf(f,m-1,m*n-n); ssa,sse,sst,f,p和SAS所得結果一樣
主成分分析
下表是某地區某時間的氣候綜合指數,其中,x1為某地區平均降水量,x2為氣壓值,x3為氣溫值,x4為絕對濕度。試用主成分分析法分析該地區的氣候綜合指數。
| x2 | 12 | 19.4 | 24.6 | 28.8 | 24.7 | 28.3 | 18.7 | 18.3 | 9.4 | 8.1 | 3.5 |
| x3 | 24 | 18.4 | 12.5 | 1 | 2.8 | 1.8 | 8.8 | 13.7 | 18.7 | 22.6 | 26.7 |
| x4 | 22.7 | 15.1 | 12.1 | 4.4 | 5.4 | 4.7 | 8.5 | 11.8 | 17.9 | 22.3 | 29.1 |
| x1 | 83.4 | 90 | 18.8 | 47.6 | 99.6 | 100.1 | 80.6 | 90 | 100.8 | 146.1 | 55.1 |
| x2 | 5.7 | 12.8 | 19.4 | 22.8 | 21 | 23 | 2.8 | 21.2 | 15.1 | 8.4 | 6.7 |
| x3 | 27.5 | 23.7 | 17.4 | 13.3 | 9.5 | 3.6 | 2.6 | 6.8 | 14.2 | 19.6 | 22.4 |
| x4 | 29.4 | 23.6 | 15.1 | 12.3 | 10.6 | 6.7 | 6.2 | 8.3 | 13.7 | 18.6 | 21.2 |
主成分分析的一般步驟
(1)將觀測數據標準化,并計算及。
(2)由相關系數矩陣****
(3)得到特征值及各個主成分的方差貢獻率、貢獻率和累計貢獻率,并根據累計貢獻率確定主成分保留的個數。
(4)寫出個基本方程組:
其中,。
利用施密特正交方法,對每一個求它的對應基本方程組的解,然后令,從而得到用所表示的主成分向量,或將代入后得到用所表示的主成分向量。
(5)將的觀測值代入主成分向量的表達式中計算各個主成分向量。
(6)計算原指標與主成分的相關系數即因子載荷,解釋主成分的意義。
請按照以上算法步驟編寫MATLAB程序,不允許用princomp工具箱
+++
解:
由于數據較多,我們將數據寫入excel表格并放入工作路徑中,通過讀取得到數據
x=xlsread('jy.xlsx','Sheet1','B1:W4');%讀取表格中數據 x=x'; xx=zscore(x);%標準化 R=corrcoef(xx);%求相關系數矩陣 [v,d]=eig(R);%d-特征值,v-特征值對應的特征向量 lamda=diag(d);%將特征值抽取出來 gx=lamda/sum(lamda);%計算貢獻比例 gx=sort(gx,'descend');%倒序排序,根據計算發現留下兩個主成分 zcf=[v(:,4),v(:,3)];%將第一主成分和第二主成分特征向量抽取出來 defen=xx*zcf;%算出主成分得分 zhpj=defen*gx(1:2,:);%綜合評價=得分*貢獻率第四問:
z1=0.2320?x1?0.5301?x2+0.5711?x3+0.5823?x4z1= 0.2320*x1 -0.5301*x2+ 0.5711*x3 + 0.5823*x4 z1=0.2320?x1?0.5301?x2+0.5711?x3+0.5823?x4
z2=?0.9347?x1+0.1105?x2+0.2465?x3+0.2312?x4z2= -0.9347*x1+ 0.1105 *x2+ 0.2465 *x3+ 0.2312*x4 z2=?0.9347?x1+0.1105?x2+0.2465?x3+0.2312?x4
綜合評價
以下是某種算法
(1)確定因素集;
(2)確定評判集;
(3)進行單因素評判得;
(4)構造綜合評判矩陣
(5)綜合評判:對于權重A={a1,a2,,an},計算,并根據最大隸屬度原則作出評判.
在進行綜合評判時,根據算子的不同定義,可以得到不同的模型.
請用MATLAB編寫上面程序,并計算下面的問題。
考慮一個服裝評判的問題,為此建立因素集,其中u1表示花色,u2表示式樣,u3表示耐穿程度,u4表示價格.建立評判集,其中v1表示很歡迎,v2表示較歡迎,v3表示不太歡迎,v4表示不歡迎.進行單因素評判的結果如下:
,,
,.
設有兩類顧客,他們根據自己的喜好對各因素所分配的權重分別為:
.
試分析這兩類顧客對此服裝的喜好程度.
+++
解:
1、因素集確定:根據題目要求,設u1 表示花色,u2 表示式樣,u3 表示耐穿程度,u4 表示價格,則得到因素集為:
2、評判集確定:為了更好的對所有的因素做出評價,則設以下以下4 個程度:其中v1 表示很歡迎,v2 表示較歡迎,v3 表示不太歡迎,v4 表示不歡迎,由以上得到評判集:
3、單因素評判:對花色、式樣、耐穿程度、價格4 種進行單因素評判得到以下結果:
4、構造評價矩陣:根據以上4 種單因素評判得到的結果,得到評價矩陣:
5、綜合評判:
為了同時兼顧到所有因素對整體喜好程度的影響,則需要建立加權平均模型。
B = A* R = (b1,b2 ,b2 ,b4 )
根據以上模型在MATLAB 中編程:
r=[0.2,0.5,0.2,0.1 0.7,0.2,0.1,0 0,0.4,0.5,0.1 0.2,0.3,0.5,0]; a=[0.1,0.2,0.3,0.4 0.4,0.35,0.15,0.1]; B=a*r根據最大隸屬原則可以得到,A1類顧客對產品的喜好程度為不太歡迎,A2類顧客對產品的喜好程度為比較歡迎。
結語
蕪湖,終于趕在忍界大戰前寫完了!今晚第三次忍界大戰!應該比春晚好看多了🤩
上場名單
TES 36鮫 宇智波卡薩 大手丸 宇智波水 藥師預
IG 邁特曬 旋渦寧人 卡卡雞 佐芙 春野藍
大伙們今晚把飯盆收一收,該減減肥了(lll¬ω¬)
總結
以上是生活随笔為你收集整理的数学建模之MATLAB编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何在命令行下用命令slmgr激活win
- 下一篇: 使用原生js,写了一个心算口算天天练