2013-12-18 52 views
0

我必須創建一個連續替換的函數。例如, 我有一個函數F(X,Y)=(sqrt((X-Y)/(X-1)))/ tanh(sqrt((X-Y)/(X-1))))。C中的連續替換函數

(X爲常數)

我有進入和檢查這樣的Y值(小於X):

Value 1: SET Y=0 
     E1 = F(X,Y) 
    then E2 = F(X,E1) 
    THEN E3 = F(X,E2) 
      . 
      . 
      . 
      . 
     E(n) = F(X,E(n-1)) 

and stop when (fabs(E(n)-E(n-1))<= 0.001); 

我試圖用一個do-while循環,但我沒沒有辦法讓它工作。

#include <math.h> 
#include <stdio.h> 
#include <stdlib.h> 

#define F(Ei,E) (sqrt (M*(Ei-E)/(Ei-1)))/tanh(sqrt(M*(Ei-E)/(Ei-1))) 

#define Ei  1 + ((Db*CBoo)/(b*Da*CAi)) 
#define M   (Da*k2*CBoo)/(kl*kl) 

int main(){ 

    double k2,Da,Db,b,h,CAi,CBoo,kl,E,i; 
    double E1 ,E2 ; 
    kl =1; 
    k2 = 3; 
    Da = 0.4; 
    Db = 0.3; 
    CAi = 3; 
    CBoo = 5; 
    b = 2; 
    E1=0; 
    E2=0; 
    E=0; 
    i=0; 

    do 
    { 
     E1 = E2; 
     E2 = F(Ei,E1); 

     printf("dd"); 
    }while(fabs(E2-E1)<= 0.0001); 

    printf("\nanswer is %lf",E1); 

    system("PAUSE"); 
} 

循環只做1輪,答案永遠是0

任何想法如何做到這一點?

謝謝!

+6

需要顯示一些代碼,否則獵犬會攻擊。 –

+0

我試圖避免它,我想這樣做幾個小時,我迫切需要更多的練習在C。但是謝謝。 – user3112161

+0

你在'do-while'之前做過'E2 = 0'嗎? – Skyler

回答

1

首先,您需要更改while(fabs(E2-E1) <= 0.001)while(fabs(E2-E1) > 0.001)正如指出的MicroAlex。

它仍然無法正常工作的原因是,術語sqrt(X-Y)限制你的函數F(X,Y)到間隔[0, X]域除非你準備應對複雜的數字(你都沒有,很明顯)。隨着你的出發點Y0=0,你立即得到一個新的Y1=F(X,Y0)以外的功能域。這就是爲什麼它在一次迭代後破裂的原因。事實上,你很幸運,因爲循環條件的行爲基本上是不確定的。

所以真正的問題在於你的數值方法。這個問題似乎不適用於定點迭代。實際上你想做什麼?

編輯

之所以定點迭代不工作,可能是該功能是不是李氏連續的(由於開方名詞,但我沒有檢查)。你可能會更好地嘗試一個不同的根解算器,如開始時間間隔爲二分法[0, X]

2

您應該使用的while(fabs(E2-E1) > 0.001)代替while(fabs(E2-E1) <= 0.001)

+0

但是我希望2個函數的差別小於容差。當我改變它時,它會循環2次並返回一個大於Ei的值,這是我不能使用的。 – user3112161

+0

當差值小於容差時,你想停止,當不是時,保持循環,這是'while(fabs(E2-E1)> 0.001)'將會執行的操作。 –