在 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&gt;0),我得到的 x 值与正确值相去甚远。

我真的迷路了,非常感谢任何帮助。

谢谢。

【问题讨论】:

fabs(diff) 不太可能完全等于零;也许您应该将其与一些非常小的数字进行比较。 while(fabs(diff)&gt;0) 更改为 while(fabs(diff)&gt;eps) 其中eps 被定义为一个小数字,具体取决于您的容错能力。比如1.0e-4 while(fabs(diff)&gt;0) 说的是一回事,但您在while 循环旁边的评论却是另一回事。 @MFisherKDX 我将零更改为 1e-5,它给我的输出与我使用 'while(diff>0)' 时得到的输出相同(不正确) @Aspect 尝试与两倍于x 步长的值进行比较;例如如果步长为 0.0001,请尝试 while(fabs(diff)&gt;0.0002) 【参考方案1】:

这里的问题是您正在将一个双精度值与零进行比较,该值永远不会满足并且结果是永远不会结束的循环。

例如

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

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

因此你的 while 循环变成了永无止境的循环。因此尝试如下所示

   while(fabs(diff)> .00001 )  

【讨论】:

以上是关于在 C 中找到函数的第一个转折点的主要内容,如果未能解决你的问题,请参考以下文章

人生不是赢在起点,而是赢在转折点

10月,人生的转折点。

曲线非线性转折点怎么求

怎样用origin7.5 由已知的一些点做出一条折线图,求解折线图转折点的坐标值(未知)?

如何按值对数组进行排序(排序)? *有一个转折*

#yyds干货盘点# 3. 无转折不编程,滚雪球学 Python