“if”总是经过第一个,即使它大多数时候为零。我不知道为什么,只有当 startr 足够大时它才会执行这些操作,在较小的 startr 上它效果很好
此外,代码的目的是找到函数的局部最小值
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 %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 处的比较标记错误,而且我正在寻找函数的根而不是它的导数
关于c - 由于未知原因 "if"在条件为零时起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53642716/