用函数指针求解方程式难度

时间:2017-10-22 05:52:40

标签: c algorithm math logic

我正在尝试编写一个程序,该程序旨在运行一个无限for循环,找到两个函数相交的(x,y)坐标。我已经完成了编写程序,但在运行程序时,没有任何反应。

这是我认为缺陷的部分:

for (;;) {
    // Calculate the y-coordinate's of the Midline.
    midLine = (low + high) / 2;
    fMid = f(midLine);
    gMid = g(midLine);
    // if the y-coordinate of fMid == gMid, break and return midLine
    if (fMid == gMid) break;

    if (fLow < gLow && fHigh > gHigh) {
        high = midLine;
        fHigh = fMid;
        gHigh = gMid;
    }
    else {
        low = midLine;
        fLow = fMid;
        gLow = gMid;
    }
}

我认为问题在于我的数学逻辑,但无论我如何看待它,我都无法理解我的错误。我很欣赏任何关于我的逻辑出错的提示或提示。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

double solveEq (double(*f)(double x), double(*g)(double x), double low, double high);
double quadratic (double);
double cubic (double);

int main() {
double lo = 0, hi = 0;
printf ("Enter two values for lo and hi: ");
scanf_s ("%lf%lf", &lo, &hi);
double x = solveEq(quadratic, cubic, lo, hi);
printf("\nSuccessful. x = %f.\n", x);
system("Pause");
return 0;
}
double solveEq (double(*f)(double x), double(*g)(double x), double low, double high) {
double fLow = (*f)(low);
double fHigh = (*f)(high);
double gLow = (*g)(low);
double gHigh = (*g)(high);
// check if fLow == gLow intersects or fHigh == gHigh. If they do, break and return X. 
if (fLow == gLow) return low;
if (fHigh == gHigh) return high;
double midLine = 0, fMid = 0, gMid = 0;
for (;;) {
    // Calculate the y-coordinate's of the Midline.
    midLine = (low + high) / 2;
    fMid = f(midLine);
    gMid = g(midLine);
    // if the y-coordinate of fMid == gMid, break and return midLine
    if (fMid == gMid) break;

    if (fLow < gLow && fHigh > gHigh) {
        high = midLine;
        fHigh = fMid;
        gHigh = gMid;
    }
    else {
        low = midLine;
        fLow = fMid;
        gLow = gMid;
    }
}
return midLine;
}

double quadratic(double x) {
return x*x;
}

double cubic(double x) {
return x*x*x;
}

1 个答案:

答案 0 :(得分:0)

  1. 二进制搜索仅适用于单调(排序)数组,函数,系列......

    因此,对于非减少或仅增加不增加的数组,函数,系列...在他的评论中建议正好为 n.m。。如果你有任意函数,你需要使用更复杂的东西,如

    或检查功能并将其划分为单调间隔并分别处理。

  2. if (fMid == gMid) break;使用double是错误的。

    将其更改为

    if (fabs(fMid-gMid)<1e-6) break;
    

    并将1e-6阈值设置为您需要的精度。

    当您使用double时,它们确实包含舍入错误,因此在某些(或大多数情况下)它们将无法完全匹配,并且很可能永远不会发生完全匹配条件(需要时)。所以break当两个数字之间的距离足够小而不是精确匹配时。{/ p>

  3. OP中的
  4. 您在数学>行缺少#include

    我修复了它,但它建议你要么没有复制粘贴代码,这可能暗示存在其他错别字。或者你的原始代码是不可编译的,这是它不能做你想做的主要原因(你的编译器应该在这种情况下抛出错误而不产生可执行文件)