2017-10-30 11 views
2
に機能の
#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

#define PI 3.14159265 

int main() 
{ 
    setvbuf(stdout,NULL,_IONBF,0); 
    setvbuf(stderr,NULL,_IONBF,0); 
    double x, y;   
    double a=0.4+(6019.0/25000.0);   
    double diff; 
    double diff2; 

    x=0;   //Starting Value of x=0 
    diff=a;  //Setting diff to start with value of 'a'. Because at x=0, f'(x)=a 


    while(fabs(diff)>0)  //Starts a while loop, which runs until diff<=0 
    { 
     diff=(a*pow(x, a-1)-((1/a)*pow(x, (1/a)-1)+a)) * cos(pow(x, a) - pow(x, 1/a) + (a*x));  //f'(x) 
     x+=0.0001;  

    } 

printf(" The First Maximum Turning Point is at x=%g\n",x);  //prints the x coordinate of the TP 

return 0; 
} 

を転機ファーストを検索しますこれは無関係なコードの初期の部分に関連しています。私はあなたのように私の「Y」変数を無視することができますC.</p> <p>で線形探索法を使用して、関数の最初の転換点を見つけようとしていますC

私はwhileループを使ってxをdy/dxに入れようとしています(私はその派生物が正しいことを確認しました)、そして| dy/dx | > 0(別名は転換点ではないが)、dy/dxがゼロに達するまでxが少しずつ増加する。それは、この時点でxの値を表示することを意味します。

しかし、私がこのコードを実行すると、私はすべて終わりのないループになります。

代わりにwhile(diff>0)を使用すると、xの値が正しい値に近くなりません。

私は本当にここで失われており、本当に助けに感謝します。

ありがとうございました。

+1

'fabs(diff) 'は正確にゼロに等しいとは考えられません。たぶんあなたはそれをいくつかの非常に小さな数字と比較するべきでしょう。 – frslm

+0

'while(fabs(diff)> 0)'は(fabs(diff)> eps)whileに変更されます。 'eps'はエラーの許容誤差に応じて小さな数値として定義されます。おそらく '1.0e-4'のように。 – MFisherKDX

+0

'while(fabs(diff)> 0)'は1つのことを言いますが、whileループの隣にはあなたのコメントがあります。 –

答えて

0

ここで問題となるのは、二重の値とゼロとを比較しています。これは決して満たされず、結果は決してループを終了しません。

例えば

if(.00001 > 0)// a true value 

if(.00000000000000000001 > 0)//is still true. 

ので、あなたのwhileループは、ループを終了することはありませんとなっています。したがって、以下のようなものを試してみてください。

while(fabs(diff)> .00001) 
関連する問題

 関連する問題