關(guān)于matlab的數(shù)值積分
創(chuàng)新互聯(lián)建站專注于隆安網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供隆安營銷型網(wǎng)站建設(shè),隆安網(wǎng)站制作、隆安網(wǎng)頁設(shè)計(jì)、隆安網(wǎng)站官網(wǎng)定制、微信小程序開發(fā)服務(wù),打造隆安網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供隆安網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
-
[matlab應(yīng)用]
函數(shù)3
rat,rats
功能
有理分式近似。雖然所有的浮點(diǎn)數(shù)值都是有理數(shù),有時(shí)用簡單的有理數(shù)字(分子與分母都是較小的整數(shù))近似地表示它們是有必要的。函數(shù)rat將試圖做到這一點(diǎn)。對(duì)于有連續(xù)出現(xiàn)的小數(shù)的數(shù)值,將會(huì)用有理式近似表示它們。函數(shù)rats調(diào)用函數(shù)rat,且返回字符串。
格式
[n,d]
=
rat(x)
%對(duì)于缺省的誤差1.e-6*norm(x(:),1),返回陣列n與d,使n./d近似為x。
[n,d]
=
rat(x,tol)
%在指定的誤差tol范圍內(nèi),返回陣列n與d,使n./d近似為x。
rat(x)、rat(x…)
%在沒有輸出參量時(shí),簡單地顯示x的連續(xù)分?jǐn)?shù)。
import re
x = 'Cat eats rat.'
f = lambda x: [e.lower() for e in re.findall(r'\b\w+\b', x)]
a = f(x)
print(a)
最初知道m(xù)atlab可以創(chuàng)建鏈表是通過閱讀博客:在matlab中實(shí)現(xiàn)鏈表知道的。然后通過仔細(xì)閱讀matlab幫助文檔,終于自己搞明白如何利用matlab創(chuàng)建鏈表。首先介紹matlab中的類。
1 matlab中的class
起初認(rèn)為matlab是面向過程式的語言,通過編寫一系列函數(shù)或者腳本完成任務(wù),但其實(shí)matlab中也可以通過創(chuàng)建類的方式實(shí)現(xiàn)面向?qū)ο缶幊?。其?shí)自己早就應(yīng)該發(fā)現(xiàn),在File的New菜單中第三項(xiàng)就是class(圖一),但是囿于固有思維,從來沒有深究過。
圖1 matlab File菜單中New選項(xiàng)的菜單項(xiàng)
1.1 類文件夾
當(dāng)要?jiǎng)?chuàng)建一個(gè)類時(shí),我們應(yīng)該將類文件放在什么位置。matlab為我們提供了兩種方法:
1. 在matlab路徑下創(chuàng)建一個(gè)文件夾,然后在文件夾中創(chuàng)建一個(gè)單獨(dú)的自包含的類定義(圖二);
2. 在matlab路徑下,創(chuàng)建一個(gè)@+類名的文件夾,在其中創(chuàng)建一個(gè)類,同時(shí)我們可以將類的定義分散在多個(gè)文件中,也即該文件夾下都是該類的定義;
圖2 方式一創(chuàng)建類
圖3 方式二創(chuàng)建類
和其他高級(jí)語言(Java)類似,matlab還允許我們將這些類組織成包(packages)。包文件夾的父文件夾必須在matlab路徑下,但是包文件夾不必。包文件夾以‘+’開頭,可以包含多個(gè)類定義或者其他的包(圖四)。一個(gè)包文件夾定義了一個(gè)新的命名空間,所以我們可以重用類名。引用包中的類或者函數(shù)時(shí)需要包含包名稱,例如packagefld1.ClassNameA(),packagefld2.packageFunction()。
圖4 包文件夾的結(jié)構(gòu)
更多細(xì)節(jié)可參考matlab幫助中的Class Folders部分(在搜索框中輸入Class Folders搜索即可)。
1.2 類定義
要?jiǎng)?chuàng)建一個(gè)類,matlab會(huì)自動(dòng)幫我們生成一個(gè)類框架,一般如下:
classdef (attribute1 = value,...) classname( superclass_name)
properties
PropName
end
methods
methodName
end
events
EventName
end
end
類名必須要與文件名相同,第一個(gè)括號(hào)中聲明類的屬性,類似于java中的public等關(guān)鍵詞,更詳細(xì)的解釋可參考:Class Attributes。第二個(gè)括號(hào)指明類是否需要繼承父類,類似于java中的extends關(guān)鍵字或者C++中的‘:’。matlab支持多重繼承,更詳細(xì)的解釋可參考:Creating Subclasses —Syntax and Techniques。在實(shí)現(xiàn)鏈表的過程中,我們需要繼承handle類。完整的一個(gè)類模塊如下圖:
圖5 一個(gè)完整的類模塊
properties類似于java或C++中的成員變量,我們也可以給其設(shè)定各種訪問屬性,更詳細(xì)的解釋可參考:Defining Properties。
methods就是具體的函數(shù)實(shí)現(xiàn)。有很多種不同類型的函數(shù),下面簡要介紹:
普通函數(shù)(Ordinarymethods)。我們實(shí)現(xiàn)的大部分都是普通函數(shù),它負(fù)責(zé)完成該類要完成的主要任務(wù)。
構(gòu)造函數(shù)(Constructormethods)。和其他高級(jí)語言類似,也必須是類名,用來給屬性賦值。唯一不同是它必須返回它創(chuàng)建的對(duì)象。更詳細(xì)的解釋可參考:Class Constructor Methods。
析構(gòu)函數(shù)(Destructormethods)。名字必須是delete,用來釋放空間。更詳細(xì)的解釋可參考:Handle Class Delete Methods。
屬性訪問函數(shù)(Propertyaccess methods)。類似于其他高級(jí)語言中的set、get函數(shù)。更詳細(xì)的解釋可參考:Controlling PropertyAccess。
靜態(tài)函數(shù)(Staticmethods)。類似于其他高級(jí)語言中的靜態(tài)函數(shù),通過類對(duì)象進(jìn)行訪問。
轉(zhuǎn)換函數(shù)(Conversionmethods)。是對(duì)其他類構(gòu)造函數(shù)的重載,可以將自己定義類的對(duì)象轉(zhuǎn)換成重載構(gòu)造函數(shù)類的對(duì)象。更詳細(xì)的解釋可參考:Converting Objects to Another Class。
抽象函數(shù)(Abstractmethods)。無需解釋,用來在子類中繼承的函數(shù)。
對(duì)于events部分,自己缺乏了解,大家可以參考Defining Events and Listeners — Syntax and Techniques章節(jié)自己去研究。
1.3 普通函數(shù)
普通函數(shù)是我們平時(shí)寫程序用的最多的函數(shù),所以對(duì)其使用做更多的介紹。
1.3.1 基本構(gòu)成
下面是一個(gè)函數(shù)演示:
classdef ClassName
methods (AttributeName = value,...)
function x =compute(obj,inc)
x = obj.y + inc;
end
end
end
可以看出其定義和在matlab中編寫一個(gè)函數(shù)文件很類似,就是多了一個(gè)函數(shù)屬性。同時(shí)我們需要注意:非靜態(tài)函數(shù)需要顯示包含類對(duì)象,matlab暫時(shí)不支持隱式調(diào)用類對(duì)象。
1.3.2 調(diào)用規(guī)則
當(dāng)matlab調(diào)用一個(gè)普通函數(shù)時(shí),它按如下規(guī)則決定該調(diào)用哪一個(gè)函數(shù):
1. 方法的第一個(gè)參數(shù)對(duì)應(yīng)類級(jí)別最高的情況下,調(diào)用該類的函數(shù)定義;
2. 上述類沒有定義該函數(shù),則從matlab路徑中尋找函數(shù)。
針對(duì)規(guī)則一,matlab幫助中有一個(gè)例子:For example, suppose classA defines classB as inferior and supposeboth classes define a method called combine. Calling the method with an objectof classB and classA: combine(B,A),actuallycalls the combine method of classA because A is the dominant argument.
1.3.3 調(diào)用方式
調(diào)用類的函數(shù)時(shí),我們可以采用兩種方式:
1. 可以直接調(diào)用函數(shù),然后第一個(gè)參數(shù)是類對(duì)象,或者
2. 將第一個(gè)參數(shù)類對(duì)象提到函數(shù)前面,然后加‘.’,類似于其他高級(jí)語言中的方法調(diào)用,推薦第二種方。
當(dāng)然在極特殊的情況下,兩種方式會(huì)得到不同的結(jié)果,具體可參考:Determining Which Method Is Invoked。
1.4 靜態(tài)函數(shù)
靜態(tài)函數(shù)一般用在不需要?jiǎng)?chuàng)建對(duì)象就可以調(diào)用的情況下。下面是一個(gè)具體的靜態(tài)函數(shù)定義:
classdef myClass
...
methods(Static)
function p = pi(tol)
[n d] = rat(pi,tol);
p = n/d;
end
end
end
我們需要做的就是將函數(shù)的屬性聲明成Static,然后第一個(gè)參數(shù)也不必是類對(duì)象,調(diào)用的時(shí)候直接用類名調(diào)用。
2 matlab下鏈表的實(shí)現(xiàn)方法
在matlab示例代碼中,包含一個(gè)雙向鏈表的例子,就是一開始博客中提到的例子。該代碼實(shí)現(xiàn)了一個(gè)雙向鏈表值得我們仔細(xì)研究。其代碼在目錄:…\help\techdoc\matlab_oop\examples\@dlnode下。我們仿照該代碼實(shí)現(xiàn)一個(gè)單向鏈表。
首先定義一個(gè)節(jié)點(diǎn)類node:
classdef node handle
properties
data
end
properties(SetAccess = public)
next
end
methods
function node = node(data)
if nargin 0
node.data=data;
end
end
end
end
該類必須繼承于handle,然后有一個(gè)data屬性,用來保存數(shù)據(jù),和一個(gè)next屬性,用來指向下一個(gè)節(jié)點(diǎn)。
之后定義一個(gè)鏈表類linkedlist:
classdef linkedlist handle
properties (GetAccess = public, SetAccess = public)
head
tail
size
end
methods
%創(chuàng)建一個(gè)空的鏈表,是構(gòu)造函數(shù)
function list = linkedlist()
list.size=0;
end
%在鏈表的尾部添加一個(gè)元素
function append(list,node)
if isempty(list.head)
list.head=node;
list.tail=node;
else
list.tail.next=node;
list.tail=node;
end
list.size=list.size+1;
end
%從鏈表的頭部刪除一個(gè)元素
function temp=deletefromhead(list)
if isempty(list.head)
%disp('The linked list is empty');
temp=0;
list.size=0;
return;
else
temp=list.head;
list.head=list.head.next;
temp.next=[];
list.size=list.size-1;
end
end
end
end
從上述定義,我們可以看出matlab下的鏈表實(shí)現(xiàn)和c或java語言下很類似。這也說明了語言本身并不是非常重要,關(guān)鍵是要理解算法。
上面是我對(duì)matlab類和鏈表實(shí)現(xiàn)的理解,很多地方是從其幫助文檔中直接翻譯過來的,很多地方翻譯的也不是很好,還請(qǐng)直接參看幫助文檔。
## 語法錯(cuò)誤改正 如下:
n=int(input("輸入一個(gè)整數(shù):"))
a1=0
a2=1
if n%2==0:
for i in range(n):
a1=a1+1
for i in range(n//2-1):
a2=a2+2
else:
for i in range(n):
a1=a2+1
for i in range(n//2):
a1=a2+2
print("從1到N相加的結(jié)果和從1到N奇數(shù)相加的結(jié)果分別是%d和%d"%(a1,a2))
其實(shí)應(yīng)該如此吧:
n=int(input("輸入一個(gè)整數(shù):"))
a1=0
a2=0
for i in range(n+1):
a1=a1+i
for i in range(1,n+1,2):
a2=a2+i
print("從1到N相加的結(jié)果和從1到N奇數(shù)相加的結(jié)果分別是%d和%d"%(a1,a2))
python中怎么注釋多行:
方法一:先選中要注釋的段落,然后按下“ctrl+/”,即可實(shí)現(xiàn)多行代碼的注釋。效果如下:
請(qǐng)點(diǎn)擊輸入圖片描述
再一次按下“ctrl+/”就可以取消注釋。
方法二:跟注釋單行一樣在每一行前面輸入“shift+#”。
1#r+=(i-arr[idx])*rat[idx]
2#print?(i-arr[idx])*rat[idx]
3#i=arr[idx]
方法三:可以輸入''' '''或者""" """,將要注釋的代碼插在中間,也可實(shí)現(xiàn)注釋多行代碼的效果。
關(guān)于MATLAB的數(shù)值積分 - [MATLAB應(yīng)用]函數(shù)3 rat,rats 功能 有理分式近似.雖然所有的浮點(diǎn)數(shù)值都是有理數(shù),有時(shí)用簡單的有理數(shù)字(分子與分母都是較小的整數(shù))近似地表示它們是有必要的.函數(shù)rat將試圖做到這一點(diǎn).對(duì)于有...