1. 採用inline內聯函數
Matlab中可以有采用幾種不同的方式來指定被積函數。對於簡單的、長度不超過一行的公式採用inline命令比較方便。例如,
可用下面的語句進行計算
>> f=inline('1/sqrt(1+x^4)') %採用inline內聯函數
f =
內聯函數:
f(x) = 1/sqrt(1+x^4)
>> q=quadtx(f,0,1)
q =
0.9270
從matlab第七版開始,內聯(inline)對象被一種功能更強大的結構匿名函數(anonymousfunction)所替代。在matlab第七版內聯對象還允許被使用,但推薦用匿名函數,因爲後者可以生成更高效率的程序代碼。採用匿名函數,上面的例子變爲
>> f=@(x) 1/sqrt(1+x^4) %採用匿名函數@(x)
f =
@(x)1/sqrt(1+x^4)
>> q=quadtx(f,0,1)
q =
0.9270
2. 特殊點不可積函數,採用realmin
如果我們想要計算
可能使用下面的語句
>> f=inline('sin(x)/x')
f =
內聯函數:
f(x) = sin(x)/x
>> q=quadtx(f,0,pi)
已達到最大遞歸限制 500。使用set(0,'RecursionLimit',N) 可更改此限制。請注意,超出可用堆棧空間可能會使 MATLAB 和/或計算機崩潰。
出錯 inlineeval
此時inline函數積分時好像出現了問題,因爲在計算f(0)時,出現了除以0的情況,並且最終產生遞歸限制錯誤。一種補救的方法是,將積分的下限由0變爲最小的正浮點數,realmin。
>> q=quadtx(f,realmin,pi)
q =
1.8519
這樣就可以避免遞歸錯誤情況的發生。
3. 使用m文件寫函數
針對上面出現的問題,另一種方法是使用M文件,而不是內聯函數。創建包含下面程序的文件sinc.m
function f=sinc(x)
%函數sin(x)/x
if x==0
f=1;
else
f=sin(x)/x;
end
然後使用函數句柄計算積分
>> Q=quadtx(@sinc,0,pi)
Q =
1.8519
4. 依賴於參數的積分
一個典型的例子是β函數,它定義爲
matlab中已經實現了一個現成的β函數,但我們可以以它爲例,說明如何處理積分中的參數。創建一個帶三個參數的內聯函數
>> F=inline('t^(z-1)*(1-t)^(w-1)','t','z','w')
或者創建一個M文件:
function f=betaf(t,z,w)
f= t^(z-1)*(1-t)^(w-1)
並將其命名爲betaf.m。
就像任何函數一樣,參數的順序是很重要的。定義被積函數時,必須讓積分變量爲其第一個參數。然後給出其他參數的值,作爲傳遞給quadtx的附加參數。要計算β(8/3,10/3)
應該先設
>> z=8/3;
>> w=10/3;
>> tol=1e-6;
然後運行命令
>> Q=quadtx(F,0,1,tol,z,w)
Q =
0.0348
或Q=quadtx(@betaf,0,1,tol,z,w)
---------------------
作者:吉大秦少游
來源:CSDN
原文:https://blog.csdn.net/zhanshen112/article/details/78390330