前言:中文期刊網精心挑選了c語言函數范文供你參考和學習,希望我們的參考范文能激發你的文章創作靈感,歡迎閱讀。
c語言函數范文1
一、格式說明符和輸入項的三對應(類型、個數、順序)scanf函數格式中的格式說明(“%格式字符”)應與輸入項數據類型一致,個數相等、順序對應(除格式說明中出現“*”附加格式說明字符外)。示例一:inta,b;scanf("%d%d%d",&a,&b);printf("%d,%d",a,b);輸入“345”時,輸出“3,4”,沒有錯誤提示信息,但是第三個數沒有接收的變量,也就沒有輸出。再如inta,b;scanf("%d",&a,&b);printf("%d,%d",a,b);輸入“34”時,輸出“3,-858993460”,a得到3,但b是一個隨機數,都是因為格式說明(“%格式字符”)與輸入項個數不一致造成的。再如structst{intnum;charname[10];intage;floatscore;}student;scanf("%d,%s,%d,%f",&student);輸入“10001,"zhang",23,68”,運行程序時,無出錯信息,但student不能正確接收輸入數據。
應該寫成:scanf("%d,%s,%d,%f",&student.num,student.name,&student.age,&stu-dent.score);保證格式說明與輸入項個數相等、一一對應,才能使student正確接收輸入數據。示例二:chara,b;scanf("%d%d",&a,&b);printf("%d,%d",a,b);輸入“34”時,輸出“3,4”,輸入整型數據,是字符型數據接收,但是結果正確,因為字符型數據在內存中的存放形式是整型數據。再如floata,b;scanf("%d%d",&a,&b);printf("%d,%d",a,b);輸入“34”時,輸出“0,918028288”,即a和b的結果都是隨機數,這就是輸入格式和接收的數據類型不一樣造成的。又如:inta,b;scanf("%f%f",&a,&b);printf("%d,%d",a,b);輸入“1.23.4”時,輸出“1067030938,1079613850”,即a和b的結果都是隨機數,這也是輸入格式和接收的數據類型不一樣造成的。
二、非格式說明符的輸入非格式說明符要求用戶原樣照寫輸入,既不能更改,又不能漏寫。示例一:inta,b;scanf("a=%d,b=%d",&a,&b);printf("%d,%d",a,b);輸入“12”(即1、2間用空格隔開),輸出“-858993460,-858993460”,無錯誤提示,但結果與輸入數據不一致,輸出a、b的值是隨機數。這就是因為scanf函數中設定的格式(“a=%d,b=%d”)(其中a=,b=均為普通字符)與輸入數據的格式(1、2間用空格間隔)不一致造成的,正確的輸入形式應為“a=1,b=2”(“,”也絕不能漏掉)。所以,為了保證正確輸入數據,輸入數據前首先看好程序中scanf函數設定的格式,再按照設定的格式正確輸入數據。示例二:scanf("%d,%d",&a,&b);輸入時應用以下形式:3,4注意3后面應是逗號,它與scanf函數中的“格式控制”中的逗號對應。如果輸入時不用逗號而用空格或其他字符是不對的。34(不對)3:4(不對)如果是scanf("%d%d",&a,&b);則輸入時兩個數據間應空兩個或更多個空格字符。如:34或34
三、附加格式說明符的說明示例一:inta,b;scanf("%2d%2d",&a,&b);printf("%d,%d",a,b);輸入“1234”,輸出“12,34”輸入“123”,輸出“12,3”輸入“123456”,輸出“12,34”因為格式中“d”格式字符表示輸入整型數據,“2”附加格式說明字符表示輸入數據所占寬度為2,因此,無論用戶輸入什么,系統都將自動截取兩位賦給a,再截取兩位賦給b。也就是說可以用附加格式說明符指定輸入數據所占列數,系統將自動按它截取所需數據。
再如scanf("%3c",&ch);如果從鍵盤上連續輸入3個字符abc,由于ch只能容納一個字符,系統就把第一個字符‘a’賦給ch。示例二:floata;scanf("%5.1f",&a);輸入“1234”,無錯誤提示,但a并不能接收輸入數據,輸出a的值為隨機數,再嘗試輸入別的數據,結果都為隨機數。用戶本意想用這樣的scanf格式輸入寬度為5位,小數部分為1位的小數,但得不到預想結果。因為,scanf函數中只有“域寬”(此處為5)附加格式說明字符(指定輸入數據所占列數),而沒有在“小數位數”附加格式說明字符(只有printf函數有),應該去掉“.1”,即scanf("%5f",&a);或scanf("%f",&a);均可,此時輸入“123.4”即可接收。所以,應根據scanf函數中規定的格式字符及其附加格式說明字符使用,不能濫用,輸入數據時不能規定精度。示例三:doublex;scanf("%f",&x);輸入“123.4”,輸出x的值為隨機數,沒有接收輸入的數據,再輸入別的數據,結果都為隨機數。這是因為用戶定義x為雙精度型數據,而用“%f”格式輸入數據時,不能接收,應該使用“%lf”或“%le”,即scanf("%lf",&x);此時輸入“123.4”即可接收。
因此長整型數據和雙精度型數據必須使用附加格式說明字符l,短整型數據必須使用附加格式說明字符h。示例四:inta,b;scanf("%2d,%*3d,%2d",&a,&b);輸入“12,345,67”,此時,12賦給a,67賦給b。注意:原則上“,%格式字符”應與“輸入項”(&a,&b)個數相等,一一對應,此處則出現了個數不等的情況(“%格式字符”項數為3,而輸入項數為2)。因為scanf函數中有附加格式說明字符“*”,加“*”項表示輸入的數據不賦給相應變量,因此輸入的“345”被跳過,接收下一個數據(“67”),致使“%格式字符”與“輸入項”個數可以不等的情況出現。在利用現成的一批數據時,有時不需要其中某些數據,可用此法跳過它們。例如scanf("%c%c",&a,&b);printf("%c%c",a,b);輸入AB,輸出A‘,A’給了字符變量a‘,’作為合法字符給了字符變量b。這時我們改用scanf("%c%*c%c",&a,&b);輸入AB,輸出AB,‘A’給了字符變量a‘,’被%*c跳過‘,B’就給了字符變量b??梢?,使用scanf函數時,要在scanf規定的格式字符及其附加格式說明字符下使用。既不能不用,又不能濫用。
四、注意輸入結束標志①遇到空格,或者回車鍵,或者Tab鍵。如果相鄰兩個格式指示符之間,不指定數據分隔符(如逗號、冒號等),則相應的兩個輸入數據之間,至少用一個空格分開,或者用Tab鍵分開,或者輸入一個數據后,按回車,然后再輸入下一個數據。在用“%c”格式輸入字符時,空格字符和“轉義字符”都作為有效字符輸入。示例一:scanf("%d%d",&num1,&num2);假設給num1輸入12,給num2輸入36,則正確的輸入操作為:1236或者:1236示例二:scanf("%c%c%c",&c1,&c2,&c3);如果從鍵盤輸入abc則字符‘a’賦給c1,字符‘’賦給c2,字符‘b’賦給c3。因為%c只要求讀入一個字符,后面不需要用空格作為兩個字符的間隔空格,因此空格作為下一個字符賦給c2。
c語言函數范文2
關鍵詞:函數;形參;實參;數據傳遞
中圖分類號:TP312文獻標識碼:A 文章編號:1009-3044(2007)17-31457-01
Analysis of Data Transferring from Actual Argument to Formal Argument in C Language Function Calling
LU Xiang-ning, LI Xiao-mei
(Hainan Software Professional Institute, Qionghai 571400,China)
Abstract: C's design philosophy is to use functions as building blocks. When a function is called, value of the actual argument is assigned to the variable known as the formal argument. This paper presents that the essence of data transferring from actual argument to formal parameter is value delivery and one-way.
Key words: functions; formal parameters; actual arguments; data transferring
1 引言
在C語言教學過程中,我發現有很多初學者對函數調用過程中實參和形參之間的數據傳遞問題理解不夠透徹,尤其是指針做函數參數時,常常有許多誤解。有這樣一個程序:
#include
main()
{
void swap(int *p1,int *p2);
int a,b;
int *point1,*point2;
clrscr();
scanf("%d,%d",&a,&b);
point1=&a;point2=&b;
if(a
printf("a=%d,b=%d\n ",a,b);
printf("max=%d,min=%d\n ",*point1,*point2);
}
void swap(int *p1,int *p2)
{
int *temp;
temp=p1;
p1=p2;
p2=temp;
}
編程者的目的很明顯,即編寫用戶自定義函數void swap(int *p1,int *p2),并以整型指針作為參數,在main()函數中調用這一函數來實現兩個整型數據a和b的值的互換。但這個函數能否實現兩個數值的交換呢?下面我們對其進行分析。
2 函數調用過程分析
在前面這一程序的main()函數中,整型指針變量point1、point2分別指向整型變量a、b,即point1 和point2的值分別為變量a和b的地址。在調用函數swap()時實參(point1,point2)將各自的“值”傳遞給形參(p1,p2) 。如圖1所示(圖中虛線箭頭表示數據的傳遞方向,實線箭頭表示指向),由于point1 和point2的值分別為變量a和b的地址,所以p1和p2也分別得到變量a和b的地址,即p1和p2也分別指向變量a和b。
圖1 實參向形參進行“值”的傳遞
實參向形參進行“值”的傳遞之后,執行swap()函數的函數體部分,當執行語句“temp=p1;” 后,將p1的值(主函數中整形變量a的地址)賦給指針變量temp,這時temp也指向了變量a,如圖2所示。
圖2 執行賦值語句temp=p1;后
執行賦值語句“p1=p2;”,將p2的值(主函數中整形變量b的地址)賦給p1,這時p1不再指向變量a,而指向了變量b,如圖3所示,temp和p2的指向不變。
圖3 執行賦值語句p1=p2,后
最后執行賦值語句“p2=temp;”,將temp的值(主函數中整形變量a的地址)賦給p2,這時p2的值發生改變,不再指向變量b,而指向變量a。如圖4所示。
由上述討論可以看出,編程者調用swap()函數,僅僅改變了形參變量p1和p2的值,即改變了p1和p2的指向,而這一過程中實參變量point1 和point2并沒有指向。swap()函數調用結束后,形參所占內存單元被釋放,形參變量p1和p2以及局部指針變量temp消亡。因此,該程序調用swap()函數的執行結果就是改變了通過中間指針變量temp交換了兩個形參變量p1和p2的指向,對main()函數沒有起到任何作用。
3 函數的改正及問題分析
前例中,調用swap()函數雖然不能改變實參指針變量point1 和point2的值(即它們的指向),但是我們可以改變point1 和point2所指向的內存單元當中的值,即改變整型變量a、b的值。對swap()函數做如下修改:
void swap1(int *p1,int *p2)
{ int temp;
temp=*p1;
*p1=*p2;
*p2=tem}
分析修改后的函數swap1()可知,在函數swap1()調用執行過程中,不僅沒能改變實參指針變量point1 和point2的指向,形參指針變量p1和p2的指向也一直沒有改變,只是交換了是p1和p2指向的內存單元中的值,即使a、b值互換。
這樣以來,就實現了函數調用的功能,達到了編程者的目的。
然而,也有很多人將swap()函數修改為如下形式:
void swap2(int *p1,int *p2)
{ int * temp;
*temp=*p1;
*p1=*p2;
*p2=*tem}
函數swap2()中,編程者以整型指針變量temp為中間變量,交換p1和p2所指向的內存單元中的值,是否能達到這個目的呢?
啟動TUBOR C編譯環境中,如前例在主函數中對swap2()函數進行調用,編譯時 “*temp=*p1;” 語句出現警告,忽略這個警告,運行程序,并輸入5,9按回車鍵,運行結果如圖5。
顯然,編程者的目的沒有達到,執行swap2()函數的過程中,指針變量temp和p1指向了同一個內存單元,并將p2所指向的內存單元中的值賦給p1所指向的內存單元,即將main()函數中變量b的值賦給變量a,因而出現了圖示結果。
函數swap2()中問題出現在語句“*temp=*p1;”,對指針變量temp的這種使用方式存在很大的冒險性。由于指針變量temp并沒有確定的地址值,所以temp的指向是不可預測的,對*temp賦值可能會造成重要數據的丟失,應避免指針變量的這種使用方式。
4 結論
通過這個例子,本文淺析了函數調用過程中實參與形參之間數據傳遞的實質,即“值傳遞”,就好像是實參把自身的數值拷貝了一份給形參,這種“值傳遞”是單向的,即由實參傳遞給形參,形參無法改變實參的值。筆者認為這種提法不僅有失準確性,還給初學者造成了概念上的混淆,誤認為傳遞的是實參變量的地址。初學者在學習C語言過程中,往往“談指針色變”,理解指針做函數參數的情況更是難于上青天,本文結合實例,闡述了函數調用過程中實參對形參的“單向值傳遞”性,希望對廣大初學者有所幫助。
參考文獻:
[1]譚浩強.C程序設計[M] .北京:清華大學出版社,2000.186-189.
[2]陳家駿.程序設計教程用C++語言編程[M]. 北京:機械工業出版社,2004.155-160.
[3]Herbert Schildt,著.戴健鵬,譯.C語言大全(第2版)[M]. 北京:電子工業出版社,1994.120-125.
c語言函數范文3
關鍵詞: Sleep;循環;硬件思維;指針
中圖分類號:TP312.1 文獻標識碼:A 文章編號:1671-7597(2012)0210144-01
0 引言
循環嵌套對于初學者來說是個難以理清的知識點,尤其是內層循環和外層循環之間的關系也只能是靠多加練習來體會;雖然斷點測試可以清晰的看到運行情況,但是復雜的地址和中間值對于初學者來說更難理解。我們這里借用一些輔助函數,比如說Sleep函數,來使嵌套的層次更加清晰,使break和contimue的對循環的影響更加清楚。指針更是讓許多學生望而怯步,歸根到底是學生對于硬件知識的缺乏,我們這里采用先對學生講解內存存儲原理的方式,是學生對指針的認識更加直接和深入。
1 Sleep函數在循環嵌套中的妙用
在學習循環嵌套的時候,我們往往都是寫完代碼后一次性將最終結果顯示在窗口,或者一次性將所有的結果顯示在窗口,這樣就很難看清每次循環所做的具體事情。雖然我們可以用斷點測試來看程序運行的具體情況,但是斷點測試對于初學者來說太過復雜。在這里我們用一個比較直觀的例子,再加上一些輔助函數來了解循環和循環嵌套的詳細過程。
例1:用C語言實現一個格式為“分:秒:毫秒”,范圍為00:00:00~19:59:99。
我們這里首先根據題意分析可得,1秒=1000毫秒,這里我們毫秒采用兩位,即99代表990毫秒。我們采用6個int類型變量m1(分的十位),m2(分的個位),s1(秒的十位),s2(秒的個位),ms1(毫秒的百位),ms2(毫秒的十位),他們之間的進位關系為:1m1=10m2,1m2=6s2,1s1=10s2,s2=10ms1,1ms1=10ms2,利用這些變量之間的進制關系,我們采用6層for循環嵌套來實現,循環部分的核心代碼如下:
這樣實現的結果根本做不到秒表讀秒的效果,也看不出循環執行的具體層次。所以我們引入Sleep函數,并利用“\r”來打到比較好的讀秒效果。在VC里面加上頭文件#include,便可利用Sleep函數將程序掛起(暫停)一段時間,時間長短取決于Sleep(unsigned long)函數中的參數,其參數代表毫秒,Sleep(1)表示將程序在此掛起1毫秒,在本例題里,我們采用Sleep(10)表示將程序每執行一次printf函數就掛起10毫秒,剛好和秒表的右邊第一位跳一次的時間相等。利用“\r”返回行首,這樣我們改造后的代碼為:
return 0;}如此一來,我們就實現了秒表的效果。通過秒表的貼近日程生活的進位顯示現象,我們可以非常清晰的看出循環嵌套之間的層次,從而對循環嵌套有一個一步到位的清楚認識;并通過添加Sleep函數的使用,還對學生自主拓展知識有一定的引導作用。
2 硬件思維在理解指針中的妙用
語言課是學生的入門課,由于沒有地址的概念,所以對于指針的認知一直都是難點。我們這里先向學生介紹內存及內存地址的組織情況,從內存地址的角度來講解指針,這將是學生對指針的認識和掌握有個一步到位的認識。
所謂指針,其實就是所需的操作數的地址,我們這里以簡單的直接一次間接尋址為例,我們先看一下內存和內存地址的簡單組織情況:
我們舉一個簡單的例子來說明,例如有如下定義:
int a=1000,*p;
p=&a;
這里的內存和內存地址結構我們就以上面簡單的形式組織,以典型的32位字長為例,變量值和指針(地址)均可放到內存單元中。剛開始定義變量a并賦予其初始值1000的時候,我們是將變量a的值1000存到000號單元中,然后定義指針變量p時是將008號單元分配給指針變量p,也就是說008單元中放的是指針變量p;p=&a操作是讓指針變量p指向變量a,也就是將008單元中的指針變量值具體化為000,在以后的通過指針p引用變量a的時候,*p中的*的意思是指:取指針變量p的值(000)作為地址去找操作數,而000號單元中放的就是變量a。這也就是在引用時,*p和a是等價的。
利用內存結構還很容易在函數中用指針傳參能改變變量的值,而通過普通變量傳參因為作用域的問題而無法改變變量值。例如有如下代碼:
輸出結果中,a=1b=4,在調用函數fun的時候,第一個參數傳的是變量a的值,但是main函數中的a和fun函數中的a并不是一個變量,000單元中的變量a是main函數中的a,003中的a是fun函數中的a,a=3是對fun中的a賦值,并未對main函數中的a做出任何改變;但fun函數中的*q=4是對q中的地址001中的變量b進行賦值,而001中的變量b剛好是main函數中的b,所以main函數中的printf語句輸出的a還是1,而b則變成了3。
以上就是硬件思維在指針學習中的作用。
參考文獻:
c語言函數范文4
關鍵詞:C語言;函數;調試技術
中圖分類號:G642.4 文獻標志碼:A 文章編號:1674-9324(2014)11-0085-02
C語言是一門函數式語言。學習C語言編程必須學好函數的使用。筆者在多年的教學過程中,發現學生在學習函數的過程存在一些問題。雖然這些內容教師在課堂上都十分認真地講解,但有些學生還是覺得內容很抽象,不容易理解。程序調試技術一般用在程序查錯上。在程序調試的過程中,可以看到程序的執行過程,包括函數的調用過程、形參實參的傳遞,變量的內存地址等內容,這樣可以很直觀地給學生講解函數的相關內容,因此筆者在函數的教學中使用了程序調試技術,使教學內容不再抽象,而是具體化,使學生能夠更好地掌握相關知識,達到了較好的結果。
程序調試技術在函數教學中的具體使用:
1.通過調試技術直觀地查看函數的調用過程。首先設計一個簡單的使用函數的實例,jc函數實現計算n的階乘。在main函數中通過函數調用來求任意一個整數的階乘。double jc(int n),{ double mul=1;//……2,int i;for(i=1;i
2.通過程序調試技術了解函數參數傳遞過程和局部變量的概念。在函數教學中,形參和實參的關系往往是學生容易出錯的地方。形參和實參是兩個不同的變量,實參的作用就是給形參傳值。而函數的形參以及函數內定義的變量都是函數的局部變量,只能在該函數中使用。而在調試中通過查看變量的值可以很清晰地看到這些知識的作用,則比較生動具體。在上例中,程序在斷點停下后,選擇debug工具欄中的watch項,打開watch對話框,在對話框中輸入num和n,如圖3所示,此時num的值是5,而由于jc函數還沒有被調用,形參n還不存在。然后選擇Step into(F11)項,跟蹤進到jc函數內部查看,注意觀察watch對話框的變化,發現n的值變為5,而num失效了,如圖4所示。這說明程序的執行進入到jc函數,形參變量n被創建并從實參獲得了值5。而num是main函數的局部變量,在其他函數中如jc函數中是無法訪問的,從而失效。
3.通過調試技術加強對指針做函數參數的內容的理解。在講解函數的過程中,指針做參數是重點和難點之一。教師在教學過程中強調指針做形參,可以突破局部變量的限制而訪問到其他函數的局部變量,這在以后的函數使用中經常用到。但學生覺得很難理解。筆者通過調試技術運行一個實例,查看實際的運行過程,來加深學生對內容的理解。首先設計一個簡單的指針做參數的實例。void fun(int * q){*q=10;//…….2}int main(){int n=89;int * p=&n;fun(p);//…….1printf("n=%d\n",n);return 0;},在標號1處設置斷點。調試運行該程序,在斷點處停下,p是fun函數的實參。此時選擇debug工具欄中的watch項,打開watch對話框,分別輸入p和&n,如圖5所示,它們值相同,都是0x0012ff44,表示n的內存地址。然后選擇Step into項跟蹤進入fun函數內部執行,由于p和n是main函數的局部變量,在fun函數內部無法訪問,它們的值失效。然后,在watch對話框中再輸入q和*q,則可以看到如圖6的內容。說明形參q從實參p獲得了值0x0012ff44,即q也保存了main函數中n的地址,而*q的意思是通過q保存的地址訪問該地址所表示的變量。繼續單步執行,返回到main函數執行,此時查看n的值,果真變為了10。即在fun函數內部通過指針變量改變了main函數中局部變量的值。
筆者在實際的函數教學中采用了程序調試技術,讓學生直觀地看到了程序的運行過程,從而加深了學生對函數調用過程、參數傳遞、指針做參數等內容的理解。學生反應良好。計算機技術總是在不斷的發展,教師還要不斷地探索更好的教學方法,使C語言課程的教學質量進一步提高。
參考文獻:
[1]譚浩強.C程序設計(第四版)[M].清華大學出版社,2010.7.
c語言函數范文5
關鍵詞:Copula函數;交叉貨幣;匯率風險
中圖分類號:F832 文獻標識碼:A 文章編號:1672-3198(2010)02-0050-02
1 Copula相關理論
資產組合尤其是含有不同種類資產的資產組合(股票和外匯),各種金融資產邊緣分布函數通常不符合同一類型的分布函數,這種情況使得多元分布函數很難在資產定價理論中得到應用。而通過Copula函數技術可以構造靈活的多元分布函數。
Copula函數是指把多個變量的聯合分布與它們的邊緣分布連接在一起的函數。如果F1,…,Fd是一元分布函數,ui=Fi(xi),i=1,…,d,則C(F1(x1),…,Fd(xd))是具有邊緣分布函數F1,…,Fd的多元分布函數。d維Copula函數C是把多個隨機變量ζ1,…,ζd的聯合分布與它們各自的邊緣分布連接在一起的函數。Copula函數對于構造和模擬多元分布函數具有重要的意義。根據關于Copula函數最重要的Sklar定理:
令F是具有邊緣分布函數F1,…,Fd的d維分布函數,若邊緣分布函數F1,…,Fd連續,則存在一個唯一滿足F(X,…,xd)=C(F1(x1),…,Fd(xd))關系的連接函數C。
對于多元連續分布函數,一元邊緣分布函數和多元分布函數相關結構能夠被分離,多元變量之間的相關結構可以用適當的Copula函數表示。Copula函數與多元分布函數一樣,包含隨機變量之間的所有相關信息。
2 選擇合適的Copula函數
Copulas函數的類型很多,總體可以分為橢圓類分布函數連接函數和阿基米德連接函數(Archimedean copulas),而每一類又分為許多具體的連接函數。具體在定價理論中,選擇哪一種連接函數要考慮到兩方面。首先:看這種Copula函數的特征是否與現實金融市場中金融資產收益率之間的相關性相符合。其次;看這種Copula函數在實際應用中的可行性,是否存在計算技術上的難題。
在現實的金融市場中,各種金融資產的收益率并不符合正態分布的假設條件,通常表現為“尖峰”和“厚尾”的特征。與此同時,各種金融資產的收益率之間也不符合多元正態分布的假設,呈現出尾部極值相關性。符合此特征的分布函數主要有t-Copula連接函數和阿基米德連接函數中的Clayton類連接函數。在Clayton類連接函數中,一般的Clayton連接函數只能度量單側極值相關,只有Joe-Clayton連接函數在分布的上下尾部均具有相關性,而且這種相關性是非對稱的。從理論上講它比t-Copula連接函數更完美。Patton]用Joe-Clayton連接函數對外匯資產風險進行的研究,證明了其良好的特性。但是目前Joe-Clayton連接函數只能是限于二維的情況,在維數增加時,其計算任務是復雜和繁瑣的,實際中很難運用。 研究金融資產收益相關性時,t連接函數能夠反映尾部相關性,而高斯連接函數不等反映尾部相關性。當自由度v∞,除非在ρ=1,否則尾部相關系數將變為零,此時,t連接函數與Gauss 連接函數相同。因此,t連接函數比Gauss 連接函數應用更廣泛。
3 國外文獻綜述
國外關于Copula函數在交叉貨幣衍生產品定價研究中的應用:Wei(1997)對交叉外匯衍生產品進行了綜合研究。Matthew Hurd, Mark Salmon, Christoph Schleicher(1998)通過用Copula函數將歐元-英鎊和美元-英鎊匯率的隱含期權邊際分布連接起來,建立兩者的風險中性聯合分布模型。研究結果表明標準參數的Copula函數,例如常用的正態Copula和Frank Copula,不能通過觀察數據得到不對稱的程度。他們通過使用一種Bernstein形式的非參數基礎函數克服了這個問題,得到一個非常接近的擬合,最后他們將這種方法運用到貨幣指數期權定價實證研究中。Embrechts(2001)探討了在金融市場中采用線性相關指標度量相依性有其局限性,使用Copula 函數導出的相依性指標更加符合金融市場的實際。Patton(2001)構造了馬克-美元和日元-美元匯率的對數收益的二元Copula 模型,并與相應的BEKK 模型做了比較,結果表明Copula 模型可以更好地描述金融市場間的相關關系。
Lindsog和NcNeil(2003)給出了金融相關的Copulas及相關性概念的測量,著重集中在橢圓的Copulas,Archimedean Copulas和Marshall-Olkin Copulas及保險風險和市場風險(VaR)的運用上面;Ernst Eberlein and Nataliya Koval(2006) 將倫敦銀行同業拆息市場模型引入交叉貨幣衍生產品的定價理論中,詳細研究了外匯匯率的上限和下限以及交叉貨幣互換理論,引用了建立在雙邊拉普拉斯變換基礎上的有效定價算法,并給出了關于歐元-美元交叉貨幣貨幣實例進行校正檢驗。Mark Salmon, Christoph Schleicher(2006)用Copula函數對多變量貨幣期權進行定價,使用Bernstein Copula函數作為Copula的一種一般的近似過程。Sami Attaoui(2006)以現貨而不是遠期外匯匯率的動態變化為依據研究概率測度的變化,得到外匯遠期倫敦銀行同業拆息利率更為豐富的動態變化過程,解決了對倫敦銀行同業拆息市場模型中交叉貨幣衍生產品的定價。
4 國內文獻綜述
國內關于Copula函數在交叉貨幣衍生產品定價中的應用:陳松男(2002)對交叉外匯遠期合約和期權的定價進行了詳細的介紹。張堯庭(2002a),(2002b)從理論上探討了Copula 在金融上應用的可行性,指出在不確定線性關系能否正確度量相關關系時,采用一種更為靈活穩健的相關性分析工具- Copula 技術來分析變量間的相關結構更為可靠。孫志賓、顧嵐(2004)討論Copula理論中存在的一些問題和未來要解決的問題的一些思想和方法,指出Copula理論在金融中的應用價值。張世英等(2004)研究了Copula -GARCH 模型對波動性的描述。吳振翔等(2004)運用Archimedean Copula 給出了確定兩種外匯最小風險(VaR)投資組合的方法。朱光、陳厚生、李平(2006) 具體地研究了Copula 函數與極大和極小歐式期權價格的關系,并給出了該種期權價格的表達式。邵美琴(2007)運用風險中性定價原理,利用偏微分方程的方法,求出了四類匯率聯動期權的定價公式。分析資產價格的“波動率微笑”現象,在資產價格服從跳-擴散模型的基礎上,進一步考慮匯率聯動期權的定價問題,并得到了期權應滿足的積分-微分方程。龔樸,黃榮兵(2008)采用時變條件t-copula模型對我國人民幣匯率制度改革前后美元、歐元和日元兌人民幣匯率之間的相關性進行了研究,研究表明人民幣匯率制度的改革使得美元與歐元兌人民幣匯率、美元與日元對人民幣匯率之間扭曲的相關性得到了較大程度的矯正,為外匯組合風險的管理提供了參考。
從目前國內外的研究來看,利用Copula函數對交叉貨幣衍生產品進行定價的研究已經引起國內外研究學者的高度重視與廣泛興趣,并吸引了不少優秀的研究人員加入該領域。國內外學者對Copula連接函數在金融領域的應用研究主要集中于風險管理、投資組合方面,缺乏把Copula函數引進現有資產定價理論的分析,尤其是基于Copula函數基礎上的交叉貨幣衍生產品定價研究。
c語言函數范文6
【關鍵詞】CDMA系統;功率控制;效用函數
1.引言
頻分多址(FDMA)、時分多址(TDMA)、碼分多址(CDMA)是無線移動通信系統中三種基本的多址接入技術。由于CDMA擴展頻譜通信比其他技術至少能提高三倍以上的系統用戶容量。CDMA抗干擾能力強,采用最新的數字編碼技術,保證了即使在很低的信噪比環境下也能恢復信息,所以,這種數字編碼技術,還提供了更高的安全性和保密性。CDMA采用“軟切換”,即用戶在小區邊緣時,并不是先斷掉與原來小區基站的聯系,而是先與新的小區基站建立連接后,方斷開與原小區基站的聯系,即“先連后斷”,從技術上保證了越區切換時,掉線率基本為零。正由于以上顯著的優勢,CDMA作為第三代移動通信的標準。
任何技術都不是完美的,CDMA系統也不例外,也會存在一些問題。例如在上行鏈路(移動臺到基站)中,如果本小區中所有的移動臺都是相同的發射功率,由于移動臺與基站(BS)間距離不同及無線信道固有的衰落,基站接收到的離基站近的移動臺的信號功率要比接收到的離基站遠的移動臺的信號功率強,對于離基站遠的移動臺來說也是一種干擾,,稱之為“遠近效應”。CDMA要克服“遠近效應”,就要進行功率控制,即離基站較近的移動臺以較小的發射功率發射信號,離基站較遠的移動臺使用較大的發射功率,以抵償無線信道衰落。
同時CDMA系統中又存在“邊緣效應”,即在下行鏈路(基站到移動臺)中,處于小區邊緣的移動臺,不僅接受本小區基站發射的功率較小,而且還會受到鄰近小區信號的干擾。這種干擾會導致通信質量嚴重下降。為了克服CDMA系統中的“邊緣效應”和“遠近效應”,通常采用CDMA功率控制技術,即控制發射端的發射功率,補償信道衰落,減少小區間的干擾。在達到服務質量要求時,通過功率控制技術減小移動臺的發射功率,可以延長移動臺電池的使用壽命。
功率控制可以分為前向功率控制、反向功率控制、集中式功率控制及分布式功率控制等。前向功率控制是通過對基站發射的功率進行控制,集中式功率控制指在基站側進行功率控制,根據接收端收到信號的功率及通信鏈路的增益來實時的調整其發射功率。分布式功率控制是每個小區根據當前測量到的信干比及當前的發送功率來確定最佳的發射功率。
2.引入效用函數
效用函數(Utility Function)是最常用的經濟學理論的概念,用來描述用戶在消費商品時所獲得的效用與所消費的商品之間數量關系的函數。即用戶體驗到的商品服務滿意度。
定義:效用函數u,是一個從實數集合A到另一個實數集合B的一個映射,記為u:AB,如果對于任意x,yA,并且滿足u(x)≥u(y)時,表明行為x比行為y的效用高。
在通信系統中,當其信干比SIR(記為),低于門限值0時,用戶得不到滿意的通話效果,即效用函數值為零。當實際信干比≥0時,用戶獲得滿意的通話效果,此時效用函數值為1。這里可以看出,話音用戶對于的微小變化是不敏感的。對于數據通信系統,一般是以包的形式發送信息。這里假定,測所有的錯誤,并且所有錯誤數據都可以重傳。因此系統的吞吐量接收機有能力檢T可以表示為:
這里,R表示用戶的信息傳輸速率,f()是傳輸協議效率的一種度量。注意,協議的效率取決于信宿所接收到的信干比SIR,f()[0,1]。信宿端較高的信干比SIR意味著有較低的誤碼率BER,說明f()效率較好。假設移動用戶j的電池能量為E(J),移動用戶j的發射功率為pj,那么該移動用戶的的效用函數可記為uj(pj,j),即為在電池能量范圍內,在通信過程中信宿端正確接收到的比特數。該模型的效用函數u可表示為:
仍然來考慮一個典型的CDMA無線通信系統,假設該CDMA系統為一個BS和n個MS,當CDMA系統的上行鏈路的功率控制的效果較好時,小區間的干擾非常小,故在該模型中可忽略不計。
3.分布式傳統算法及其仿真結果分析
下文描述了一個傳統的分布式功率控制算法,其發射功率p計算如下[6]。
使用matlab工具對分別對分布式傳統算法和改進后的分布式算法進行仿真。
設置此次仿真參數如下:小區用戶數為Num=10個,其中擴頻增益L=128,目標信干比=10,初始試探發射功率p0=0.001。
仿真結果截圖如下:
由仿真結果可以分析出,經過一定迭代次數后,發射功率和信干比SIR都可以趨于穩定,但是從仿真結果可以明顯看出傳統算法的收斂速度較慢,發射功率大概要經過25次迭代時趨于穩定,信干比SIR大概要經過15次迭代才趨于穩定狀態。
4.改進后的算法及其仿真結果分析
跟據高等數學知識可知,形如(4)、(5)的常級數迭代方式的收斂速度較慢。若要加快發射功率和信干比的收斂速度,我們可以采用相應冪級數迭代的形式,已達到快速收斂的目的。如下是一種改進后的采用冪級數形式的分布式功率控制算法:
(6)
= (7)
使用matlab工具對分別對分布式傳統算法和改進后的分布式算法進行仿真。
設置此次仿真參數如下:小區用戶數為Num=10個,其中擴頻增益L=128,目標信干比=10,初始試探發射功率p0=0.001。
觀察改進后算法的仿真結果圖,可明顯看出冪指數迭代算法較傳統算法在收斂速度上有很大提高。
發射功率收斂速率比較:傳統算法大概在第25次迭代時,發射功率才趨于穩定。而改進后的算法,其發射功率大概在第5次迭代時就趨于穩定狀態。
信干比SIR比較:傳統算法大概在第15次迭代時,信干比才趨于穩定。而改進后的算法,其信干比大概在第4次迭代時就趨于穩定狀態。
由此可見,無論是從發射功率的收斂速度還是信干比的收斂速度,通過改進后的算法較傳統算法均有很大的改進。
5.結束語
綜上所述,改進后的基于效用函數分布式功率控制算法,在保證信干比SIR的情況下,有較小的發射功率。況且收斂速度較傳統算法有明顯提高。
參考文獻
[1]紀越峰.現代通信技術[M].北京:北京郵電大學出版社,2000.
[2]吳偉陵.移動通信中的關鍵技術[M].北京:北京郵電大學出版社2000.
[3]朱鈞.無線移動信道的仿真[M].上海:同濟大學出版社,2005.
[4]Tehodore S.Rappaport著.蔡濤等譯.無線通信原理與應用[M].北京:電子工業出版社,1999,11.
[5]王楓.DS-CDMA移動通信系統中功率控制策略的研究[D].長沙:湖南大學,2005.
[6]呂玲,朱世華,汪永剛.一種基于模糊邏輯的外環功率控制算法[J].通信學報.2002,23:2.
[7]姚國慶.博弈論[M].天津:南開大學出版社,2002.
[8]W.C.Jakes(Ed),Microwave Mobile Communications,New York,NY,Wiley,1974.
[9]Savo Glisic,Branka Vucetic,Spread Spectrum CDMA Systems for Wireless Communications,Dedham,MA,Artech House,Inc,1997,Ch.5,211-262.