首页 > 解决方案 > 由于未知原因,“如果”在条件为零时起作用

问题描述

“如果”总是通过第一个,即使它大部分时间为零。我不知道为什么,只有当启动器足够大时才会这样做,在较小的启动器上效果很好

此外,代码的目的是找到函数的局部最小值

const double delta = 0.0000001, eps = 0.000001;

int power(int i, int n)
{
   int out = 1;
   for (int k = 0; k < n; k++)
   {
      out *= i;
   }

   return out;
}

double f(double u)
{
    return ((u * u - 3) / (u + 1));
}

int main()
{
    double l = 0, r = 0, startl = -2, startr = 15;
    int k = 0, pow = 0;
    double ll = 0, rr = 0;
    double savl = 0, savr = 0;

    l = startl;
    r = startr;
    do
    {
        ll = (l + r - delta) / 2;
        rr = (l + r + delta) / 2;

        savl = f(ll);
        savr = f(rr);

        if (savl * savl > savr * savr) r = rr; 
        if (savl * savl < savr * savr) l = ll;

        k++;
        pow = power(2, k);
    }
    while (((startr - startl) / pow + (1 - 1 / pow) * delta) > eps);

    printf("%f ", (ll + rr) / 2);

    return 0;
}

我已经编辑了代码,所以所有的功能都是可见的

标签: c

解决方案


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

const double delta = 0.0000000001, eps = 0.000001;

int power(int i, int n)
{
    int out = 1;
    for (int k = 0; k < n; k++)
    {
        out *= i;
    }

    return out;
}

double f(double u)
{
    return ((u * u + 2 * u + 3) / (u + 2) / (u + 2));  //derivative of the f
}

int main()
{
    double l = 0, r = 0, startl = -2, startr = 15;
    int k = 0, pow = 0;
    double ll = 0, rr = 0;
    double savl = 0, savr = 0;

    l = startl;
    r = startr;
    do
    {
        ll = (l + r - delta) / 2;
        rr = (l + r + delta) / 2;

        savl = f(ll);
        savr = f(rr);

        if (savl * savl < savr * savr) r = rr; //printf("%f %f %e\n", savl, savr, savl * savl - savr * savr);
        if (savl * savl > savr * savr) l = ll;

        k++;
        pow = power(2, k);
    }
    while (((startr - startl) / pow + (1 - 1 / pow) * delta) > eps);

    printf("%f ", (ll + rr) / 2);

    return 0;
}

工作代码问题出在ifs的错误比较标记中,并且我正在搜索函数的根而不是它的导数


推荐阅读