【发布时间】:2018-04-11 22:01:04
【问题描述】:
#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;
}
我正在尝试使用 C 中的线性搜索方法找到函数的第一个转折点。
您可以忽略我的“y”变量,因为这与代码的前面部分无关,而这部分无关紧要。
我正在尝试使用 while 循环将 x 放入 dy/dx(我已验证导数是正确的),而 while |dy/dx| > 0(虽然它不是一个转折点),x 每次都会略微增加,直到 dy/dx 达到零。这意味着此时打印 x 的值。
但是,当我运行这段代码时,我得到的只是一个永无止境的循环。
如果我改用while(diff>0),我得到的 x 值与正确值相去甚远。
我真的迷路了,非常感谢任何帮助。
谢谢。
【问题讨论】:
-
fabs(diff)不太可能完全等于零;也许您应该将其与一些非常小的数字进行比较。 -
while(fabs(diff)>0)更改为while(fabs(diff)>eps)其中eps被定义为一个小数字,具体取决于您的容错能力。比如1.0e-4。 -
while(fabs(diff)>0)说的是一回事,但您在while循环旁边的评论却是另一回事。 -
@MFisherKDX 我将零更改为 1e-5,它给我的输出与我使用 'while(diff>0)' 时得到的输出相同(不正确)
-
@Aspect 尝试与两倍于
x步长的值进行比较;例如如果步长为 0.0001,请尝试while(fabs(diff)>0.0002)。
标签: c eclipse while-loop calculus