由于未知原因,当条件为零时"if"工作



"if"总是经过第一个,即使大多数时候它是零。我不知道为什么,只有当启动器足够大时,它才会这样做,在较小的启动器上,它的效果很好

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

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;
}

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

#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 %en", 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;
}

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

最新更新