c - 由于未知原因,“如果”在条件为零时起作用
问题描述
“如果”总是通过第一个,即使它大部分时间为零。我不知道为什么,只有当启动器足够大时才会这样做,在较小的启动器上效果很好
此外,代码的目的是找到函数的局部最小值
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的错误比较标记中,并且我正在搜索函数的根而不是它的导数
推荐阅读
- excel - Xldown 函数
- python - 检查整数列表中的元素的正值或负值
- javascript - 如何将其传递给 UTF8?
- javascript - Cypress - 模拟窗口属性
- php - 在 Laravel 中加速 wkhtmltopdf 打印数千页
- android - 在 Android 10 及更高版本的应用程序设置中创建多选列表的最佳方法是什么?
- mongodb - MongoDB 拒绝 SSL 连接
- python - 正则表达式匹配“|” 联合类型的分隔值
- android - 如何删除可检查菜单项的结束填充?
- c++ - 基于 CUDA 通道 ID 与 threadIdx.x 的计算