在 C 中找到函数的第一个转折点
Posted
技术标签:
【中文标题】在 C 中找到函数的第一个转折点【英文标题】:Finding the First Turning Point of a function in C 【发布时间】: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)
。
【参考方案1】:
这里的问题是您正在将一个双精度值与零进行比较,该值永远不会满足并且结果是永远不会结束的循环。
例如
if(.00001 > 0 )// a true value
和
if(.00000000000000000001 > 0 )//is still true.
因此你的 while 循环变成了永无止境的循环。因此尝试如下所示
while(fabs(diff)> .00001 )
【讨论】:
以上是关于在 C 中找到函数的第一个转折点的主要内容,如果未能解决你的问题,请参考以下文章