MATLAB设置x为0到10所有数,MATLAB教学_10数值微积分
本文學(xué)習(xí)視頻地址:https://www.bilibili.com/video/av68228488?p=10
課堂PPT以及本人學(xué)習(xí)代碼已上傳。
本文學(xué)習(xí)內(nèi)容:
多項(xiàng)式的微分和積分
數(shù)值的微分和積分
目錄
多項(xiàng)式的表示方法
polyval()
polyder()
16分鐘練習(xí)
conv()
polyint()
Numerical Differentiation
39分鐘練習(xí)
45分鐘練習(xí)
47分鐘練習(xí)
多次積分
數(shù)值積分
Midpoint rule :
Trapezoid rule
Function Handles(@)
創(chuàng)建函數(shù)句柄
匿名函數(shù)
多項(xiàng)式的表示方法
例如: f(x)=x^3-2x-5;
也就是 x^3 的系數(shù)為1, x^2的系數(shù)為0, x 的系數(shù)為 -2, 常數(shù)為-5;
所以 p=[1 0 -2 -5];
polyval()
y?= polyval(p,x)?計(jì)算多項(xiàng)式?p?在?x?的每個(gè)點(diǎn)處的值。參數(shù)?p?是長(zhǎng)度為?n+1?的向量,其元素是?n?次多項(xiàng)式的系數(shù)(降冪排序):
p(x)=p1^xn+p2^(xn?1)+...+pn^x+pn+1.
雖然可以為不同目的使用?polyint、polyder?和?polyfit?等函數(shù)計(jì)算?p?中的多項(xiàng)式系數(shù),但您也可以為系數(shù)指定任何向量。
要以矩陣方式計(jì)算多項(xiàng)式,請(qǐng)改用polyvalm。
[y,delta] = polyval(p,x,S)?使用?polyfit?生成的可選輸出結(jié)構(gòu)體?S?來生成誤差估計(jì)值。delta?是使用?p(x)?預(yù)測(cè)?x?處的未來觀測(cè)值時(shí)的標(biāo)準(zhǔn)誤差估計(jì)值。
clear all; %6分鐘練習(xí)
clc;
a=[9,-5,3,7]; %構(gòu)建多項(xiàng)式的系數(shù)
x=-2:0.01:5;
f=polyval(a,x); %計(jì)算多項(xiàng)式 f在每個(gè)x 點(diǎn)的值
plot(x,f,'LineWidth',2,'Color','red'); %用圖表示出來
xlabel('x'); ylabel('f(x)');
set(gca,'FontSize',14);
polyder()
多項(xiàng)式微分
clear all; %11分鐘練習(xí)
clc;
p=[5 0 -2 0 1];
polyder(p) %f'(p)
polyval(polyder(p),7) % f'(7)
16分鐘練習(xí)
做出來和老師的不一樣。有的彈幕說是p=[5 -7 5 10];? ?這里想不通。
conv()
w = conv(u,v)?返回向量?u?和?v?的卷積。如果?u?和?v?是多項(xiàng)式系數(shù)的向量,對(duì)其卷積與將這兩個(gè)多項(xiàng)式相乘等效。
w = conv(u,v,shape)?返回如?shape?指定的卷積的分段。例如,conv(u,v,'same')?僅返回與?u?等大小的卷積的中心部分,而?conv(u,v,'valid')?僅返回計(jì)算的沒有補(bǔ)零邊緣的卷積部分。
clear all; %16分鐘練習(xí)
clc;
p=[20 -7 5 10];
q=[4 12 -3];
x=-2:0.01:1;
f=conv(p,q); %如果是兩個(gè)相乘的是行向量,則可以直接使用 conv()
a=polyval(f,x); %計(jì)算 f(x)的值
b=polyval(polyder(f),x); %計(jì)算 f'(x)的值
plot(x,a,'--b',x,b,'red','LineWidth',2);
xlabel('x');
legend('f(x)',"(f'(x))")
polyint()
多項(xiàng)式積分
q?= polyint(p,k)?使用積分常量?k?返回?p?中系數(shù)所表示的多項(xiàng)式積分。
q?= polyint(p)?假定積分常量?k = 0。
clear all; %22分鐘練習(xí)
p=[5 0 -2 0 1];
x=-2:0.01:8
polyint(p,3) %求積分,常數(shù)指定為3
f=polyval(polyint(p,3),x); %計(jì)算積分的值
plot(x,f);
polyval(polyint(p,3),7) %求x=7時(shí)積分的值
Numerical Differentiation
diff()
差分和近似導(dǎo)數(shù)
Y?= diff(X)?計(jì)算沿大小不等于 1 的第一個(gè)數(shù)組維度的?X?相鄰元素之間的差分:
如果?X?是長(zhǎng)度為?m?的向量,則?Y = diff(X)?返回長(zhǎng)度為?m-1?的向量。Y?的元素是?X?相鄰元素之間的差分。 Y = [X(2)-X(1) X(3)-X(2) ... X(m)-X(m-1)]
如果?X?是不為空的非向量 p×m 矩陣,則?Y = diff(X)?返回大小為 (p-1)×m 的矩陣,其元素是?X?的行之間的差分。 Y = [X(2,:)-X(1,:); X(3,:)-X(2,:); ... X(p,:)-X(p-1,:)]
如果?X?是 0×0 的空矩陣,則?Y = diff(X)?返回 0×0 的空矩陣。
Y?= diff(X,n)?通過遞歸應(yīng)用?diff(X)?運(yùn)算符?n?次來計(jì)算第 n 個(gè)差分。在實(shí)際操作中,這表示?diff(X,2)?與?diff(diff(X))?相同。
Y?= diff(X,n,dim)?是沿?dim?指定的維計(jì)算的第 n 個(gè)差分。dim?輸入是一個(gè)正整數(shù)標(biāo)量。
clear all; %30分鐘練習(xí)
f=[1 2 5 2 1];
diff(f) %diff()返回的是 [2-1 5-2 2-5 1-2]
x=[1 2]; %因?yàn)橐笮甭?#xff0c;所以根據(jù)坐標(biāo),將X和Y的坐標(biāo)重新規(guī)劃
y=[5 7];
slope=diff(y)./diff(x) %這里用點(diǎn)乘,以防x 和 y是多個(gè)數(shù)據(jù)的矩陣
clear all; %34分鐘練習(xí)
% x=0:pi/50:2*pi;
% f=sin(x);
% g=polyder(f); %這里不能用polyder(),因?yàn)檫@個(gè)函數(shù)是多項(xiàng)式求導(dǎo),并不是連續(xù)函數(shù)
% polyval(g,x)
x0=pi/2; h=0.1;
x=[x0 x0+h];
y=[sin(x0) sin(x0+h)];
m=diff(y)./diff(x)
39分鐘練習(xí)
x0=pi/2; h=0.1; %39分鐘練習(xí)
for i=1:6
x=[x0 x0+h];
y=[sin(x0) sin(x0+h)];
m(i)=diff(y)./diff(x);
h=h/10;
end
format long
m
45分鐘練習(xí)
%%
h=0.5; x=0:h:2*pi; %45分鐘練習(xí)
y=sin(x);
m=diff(y)./diff(x);
plot(x,y);
x(length(x))=[]; %彈幕大神,把x的最后一項(xiàng)設(shè)置為空。以此和plot()匹配
hold on
plot(x,m)
%%
h=0.5; x=0:h:2*pi; %另一個(gè)方法
y=sin(x);
m=diff(y)./diff(x);
plot(x,y);
hold on
plot(x(:,1:end-1),m) %這里用到end的一個(gè)用法:索引
%x(:,1:end-1), 冒號(hào)是表示所有行,因?yàn)樵诘谝粋€(gè)屬性里,第二個(gè)1:end-1 表示 從第一列到倒數(shù)第二列。
使用?end?訪問矩陣?A?的最后一行。
A = magic(3)
A = 3×3
8 1 6
3 5 7
4 9 2
B = A(end,1:end) %這里第一個(gè)end 是最后一行, 第二個(gè) 1:end 是指列從第1列到最后一列
B = 1×3
4 9 2
具體可以查看:https://ww2.mathworks.cn/help/matlab/matlab_oop/object-end-indexing.html
不過我沒看懂。
clear all; %46分鐘練習(xí)
g=colormap(lines); %首先是將內(nèi)置的colormap(lines)賦值給了g, lines是里面內(nèi)置的一種線的顏色矩陣
hold on;
for i=1:4
x=0:power(10,-i):pi; % power()是按元素爾冪函數(shù),這里是10^(-i)
y=sin(x); m=diff(y)./diff(x);
plot(x(:,1:end-1),m,'Color',g(i,:)); %一共有4條線,依次取了lines里面第1行到第4行的顏色
end
hold off;
set(gca,'xlim',[0 pi/2]);
set(gca,'ylim',[0 1.2]);
set(gca,'FontSize',18);
set(gca,'XTick',0:pi/4:pi/2);
set(gca,'XTickLabel',{'0','\pi/4','\pi/2'});
h=legend('h=0.1','h=0.01','h=0.001','h=0.0001');
set(h,'FontName','Times New Roman');
box on;
C = power(A,B)?是執(zhí)行?A.^B?的替代方法,但很少使用。它可以啟用類的運(yùn)算符重載。
47分鐘練習(xí)
這里exp(x)? ; 就是e^x;
clc;
clear all; %47分鐘練習(xí)
g=colormap(flag);
hold on;
for i=1:3
x=0:power(10,-i):2*pi;
y=exp(-x).*sin(x.^2/2);
m=diff(y)./diff(x);
plot(x(:,1:end-1),m,'Color',g(i,:));
end
plot(x,y,'Color',g(4,:));
hold off;
xlim([0 2*pi]);
set(gca,'FontSize',20);
set(gca,'XTick',0:pi/2:2*pi);
set(gca,'XTickLabel',{'0','\pi/2','\pi','3\pi/2','2\pi'});
legend('h=0.1','h=0.01','h=0.01','h=0.001','y(x)');
xlabel('x');
ylabel('y');
box on;
多次積分
思路是先算出一次的積分,再用一次的積分再求積分。
clear all; clc; %49分鐘練習(xí)
x=-2:0.005:2;
y=x.^3;
m=diff(y)./diff(x);
m2=diff(m)./diff(x(:,1:end-1));
plot(x,y,x(1:end-1),m,x(:,1:end-2),m2);
數(shù)值積分
區(qū)間積分也就是求面積。有兩種方法:
Midpoint rule :
就是取中間點(diǎn)。在這個(gè)方法里面 h,也就是寬度是一定的。只有高度不一樣。高度也就是f(x)的值 。
下面的圖,老師講了怎么獲取這個(gè)中間點(diǎn)的辦法。第1個(gè) x 矩陣是從x1開始,第二個(gè)矩陣是從x2開始,這兩個(gè)相加除2就是中間點(diǎn)。
clear all; clc; %59分鐘練習(xí)
h=0.05; x=0:h:2;
midpoint=(x(1:end-1)+x(2:end))./2; %求積分也就是求面積,算出每個(gè)中間點(diǎn)
y=4*midpoint.^3; % 用中間點(diǎn)帶入到積分中,得出y值;
s=sum(h*y) %求出用寬度 h和高度 y的乘積并相加
%如果要精度更高,可以把 h 取小
Trapezoid rule
是用梯形的辦法求出來。
Q = trapz(Y)?通過梯形法計(jì)算?Y?的近似積分(采用單位間距)。Y?的大小確定求積分所沿用的維度:
如果?Y?為向量,則?trapz(Y)?是?Y?的近似積分。
如果?Y?為矩陣,則?trapz(Y)?對(duì)每列求積分并返回積分值的行向量。
如果?Y?為多維數(shù)組,則?trapz(Y)?對(duì)其大小不等于 1 的第一個(gè)維度求積分。該維度的大小變?yōu)?1,而其他維度的大小保持不變。
clear all; clc; %62分鐘練習(xí)
h=0.05; x=0:h:2;
y=4*x.^3;
s=h*trapz(y) %trapz()來計(jì)算梯形數(shù)值積分
%%
clear all; clc; %64分鐘練習(xí)
h=0.05; x=0:h:2;
y=4*x.^3;
trapezoid=(y(1:end-1)+y(2:end))/2;
s=h*sum(trapezoid)
辛普森的方法會(huì)準(zhǔn)確一點(diǎn),公式不會(huì)。大家自行百度。
三種方法的比較:
Function Handles(@)
句柄就像是一個(gè)指向一個(gè)函數(shù)的指針,在使用的時(shí)候利用這個(gè)指針指向其它函數(shù),就可以調(diào)用。
例如: f=sin(x); 如果我要在函數(shù)g() 里用 f時(shí),那么就要用指針去指向sin(x). 如下: g(@f,...)
創(chuàng)建函數(shù)句柄
通過在函數(shù)名稱前添加一個(gè)?@?符號(hào)來為函數(shù)創(chuàng)建句柄。例如,如果您有一個(gè)名為?myfunction?的函數(shù),請(qǐng)按如下所示創(chuàng)建一個(gè)名為?f?的句柄:
f = @myfunction;
使用句柄調(diào)用函數(shù)的方式與直接調(diào)用函數(shù)一樣。例如,假設(shè)您有一個(gè)名為?computeSquare?的函數(shù),該函數(shù)定義為:
function y = computeSquare(x)
y = x.^2;
end
創(chuàng)建句柄并調(diào)用該函數(shù)以計(jì)算 4 的平方。
f = @computeSquare; %%相當(dāng)于調(diào)用
a = 4;
b = f(a)
b =
16
匿名函數(shù)
您可以創(chuàng)建指向匿名函數(shù)的句柄。匿名函數(shù)是基于單行表達(dá)式的 MATLAB 函數(shù),不需要程序文件。構(gòu)造指向匿名函數(shù)的句柄,方法是定義?anonymous_function?函數(shù)主體,以及指向匿名函數(shù)?arglist?的以逗號(hào)分隔的輸入?yún)?shù)列表。語法為:
h = @(arglist) anonymous_function
也就是在 (arglist) 里寫未知寫, 后面緊跟著寫函數(shù)
例如,創(chuàng)建一個(gè)指向用于計(jì)算平方數(shù)的匿名函數(shù)的句柄?sqr,并使用其句柄調(diào)用該匿名函數(shù)。
sqr = @(n) n.^2;
x = sqr(3)
x =
9
clear all; clc; %75分鐘練習(xí)
y=@(x) 1./(x.^3-2*x-5); %%有一個(gè)輸入數(shù)
integral(y,0,2)
f=@(x,y) y.*sin(x)+x.*cos(y); %%有兩個(gè)輸入數(shù)
integral2(f,pi,2*pi,0,pi)
f=@(x,y,z) y.*sin(x)+z.*cos(y); %%有三個(gè)輸入數(shù)
integral3(f,0,pi,0,1,-1,1)
總結(jié)
以上是生活随笔為你收集整理的MATLAB设置x为0到10所有数,MATLAB教学_10数值微积分的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有人知道来说说,柏尔定制地板质量到底怎么
- 下一篇: 装修公司的微信服务号文章类别怎么选?