2014-03-06 31 views
0

我想解決以下特殊情況下的等式,其中l = b = 0;它應該返回完美平方函數的平方根,例如SQRT((X-d)^ 2)。這可以有兩個解,(x-d)或(d-x)。我想獲得(x-d)作爲我的最終解決方案,但程序默認返回(d-x)解決方案。我試圖改變d和x的位置,但似乎沒有任何工作。下面是我的程序:從函數的平方根返回一個首選根

float y(float x) { 
    float l=0., b=0., d=8.5, r_0=3., z_0=0.1; 
    return exp(-pow(x*x*cos(b*PI/180.)*cos(b*PI/180.)+d*d-2*d*x*cos(b*PI/180.)*cos(l*PI/180.), 0.5)/r_0)*exp(-x*pow(1-cos(b*PI/180.)*cos(b*PI/180.),0.5)/z_0) ; 
} 
int main(){ 
    FILE* fp =NULL; 
    float x0,xn,step,s,int_val, tau; /* s = distance to the star from the sun*/ 

    int i,n, j ; 
    scanf("%f%f%d",&x0,&xn,&n); 
    step = (xn-x0)/n; 
    s = y(x0) + y(xn); 
    fp = fopen("trap.txt", "w"); 
    for(i = 1; i < n; i++) { 
    s += 2*y(x0+i*step); 
    fprintf(fp,"%e\n",s*step/2); 
    } 
    fclose(fp); 
+0

是否有一些代碼缺失? – abiessu

+0

該指數具有至少一個可能的優化,即,'1-cos^2(x)= sin^2(x)'等。另外,任何你不能僅僅採用負分支的理由? – abiessu

回答

1

我假設你正在談論的部分:第一

-pow(x*x*cos(b*PI/180.)*cos(b*PI/180.) + d*d - 2 * d*x*cos(b*PI/180.)*cos(l*PI/180.), 0.5) 

第一件事,實際上是一個功能double sqrt(double x)這是計算平方根。

第二件事是,與數學攜手,sqrt(square(anything))將返回absolutevalue(anything)。在您的示例中,sqrt((x-d)^2)將等於absolutevalue(x-d)。由於absolutevalue(x-d)等於absolutevalue(d-x),改變價值觀的地方也不會改變什麼......

如果x > d,那麼它會評估爲x - d;否則到d - x,這就是數學所說的。

沒有改變的地方,但你可以簡單地在整個sqrt(square())之前放一個減號讓他們的位置改變。你已經有一個減去那裏,你可以簡單地刪除它。

有了一個平方的平方根計算結果爲絕對值的知識,您也可以替換特定的提取物我上面fabs(x * cos(b * PI/180.) - d),其中fabs是需要double的絕對值的函數寫的,並且在math.h定義。

+0

簡化到fabs(x * cos(b * PI/180.) - d)'因爲'l'是'0.0'? – chux

+0

@chux它可以工作,因爲'l == b',kek。 – ThoAppelsin

+0

非常感謝您的幫助 – Phyast10

0

使用替代來代替重複的術語。選擇常量,簡化。

#include <math.h> 
#define PI 3.1415926535897932384626433832795 

float y(float x) { 
    float l=0., b=0., d=8.5, r_0=3., z_0=0.1; 
    double y; 
    // y = exp(-pow(x*x*cos(b*PI/180.)*cos(b*PI/180.)+d*d-2*d*x*cos(b*PI/180.)*cos(l*PI/180.), 0.5)/r_0) 
    // y *= exp(-x*pow(1-cos(b*PI/180.)*cos(b*PI/180.),0.5)/z_0); 
    if (l != 0.0 || b != 0.0) { 
    double xcosb = x*cos(b*PI/180.); 
    double xsinb = x*sin(b*PI/180.); 
    double cosl = cos(l*PI/180.); 
    // general solution 
    y = exp(-sqrt(xcosb*xcosb - 2*xcosb*d*cosl + d*d)/r_0); 
    y *= exp(-xsinb/z_0); // @abiessu 
    } else { 
    // y = exp(-sqrt(x*x - 2*x*d*1.0 + d*d)/r_0); 
    // y *= exp(-0/z_0); 
    // y = exp(-sqrt((x-d)*(x-d))/r_0); 
    // y *= 1.0; 
    y = exp(-fabs(x - d))/r_0; 
    } 
    return y; 
} 

這確實獲得(x-d)作爲最終解決方案。建議OP檢查正確性的功能。

+0

感謝您的所有建議。 – Phyast10