【问题标题】:Solving Equations with Function Pointers Difficulty用函数指针求解方程的难度
【发布时间】:2017-10-22 05:52:40
【问题描述】:

我正在尝试编写一个程序,该程序旨在运行无限 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;
}

【问题讨论】:

  • 你不能使用二分搜索来求解任意方程。
  • 你试过用调试器单步调试吗?

标签: c algorithm math logic


【解决方案1】:
  1. 二分搜索仅适用于单调(排序)数组、函数、序列...

    所以只有非递减或非递增的数组、函数、系列......正如 n.m. 在他的评论中建议的那样。如果您有任意功能,则需要使用更复杂的功能,例如

    或检查函数并将其划分为单调区间并分别处理。

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

    改成

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

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

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

  3. 在 OP 中,你在数学 #include 行中缺少 &gt;

    我已修复它,但它建议您要么没有复制粘贴代码,这可能暗示存在其他拼写错误。或者您的原始代码不可编译,这就是它无法执行您想要的操作的主要原因(您的编译器在这种情况下应该抛出错误并且不会生成可执行文件)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 2018-06-29
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多