使用C++计算上限和下限
Calculating upper and lower limits using C++
我正在写一个 class,它根据常量数组 a 和指数数组 b 吐出多项式,这样生成这个等式:
但是这个方程没有f(0)的解,但是可以用两边的极限来计算(假设它们是相等的)。你怎么能用 C++ 实现这个,因为我完全不知道从哪里开始。
编辑
感谢您的评论(我还不能评论)。我写代码确实有点太快了,但我还是想自己写函数,因为这正是我想学的东西。
希望这段代码对您有所帮助
#include <iostream>
#include <math.h>
double F(int X)
{
const int numOfSentence = 3;
double a[numOfSentence] = { 2,4,6 };
double b[numOfSentence] = { 1,2,-1 };
double result = 0;
for (int i = 0; i < numOfSentence; i++)
{
result += a[i] * pow(X, b[i]);
}
return result;
}
int main()
{
std::cout << F(2);
}
通常,f(0)
的限制将仅取决于归一化多项式的最小指数。
归一化多项式(我称之为)是多项式,其中属于重复 b
值的所有 a
值相加,只有非零 [=12] =] 值被保留。
- 如果最小的指数大于0,则
f(0) = 0
- 如果最小的指数为0,对应的
a
值就是f(0)
的结果
- 如果最小指数小于0,则极限为正and/or负无穷大
- 即使是最小的指数也意味着上下限方向相同
- 奇数最小指数表示上下限方向相反
此方法仅适用于整数 b
。至少我没有调查其他案例的所有细节。
#include <iostream>
#include <limits>
#include <map>
using namespace std;
double f0(int* a, int* b, int n);
int main()
{
int a[] = {2, 4, 6, -2, 5, -4};
int b[] = {2, 1, -1, -1, 0, -1};
// number of values in array a and b
int n = 6;
double result = f0(a, b, n);
cout << "f(0) = " << result << endl;
return 0;
}
double f0(int* a, int* b, int n)
{
map<int, int> exponents;
for (int i = 0; i < n; ++i)
{
exponents[b[i]] += a[i];
// debug printing intermediate sums per exponent
cout << b[i] << ": " << exponents[b[i]] << endl;
}
int minExp = 0;
for (auto it = exponents.begin(); it != exponents.end(); ++it)
{
if (it->second != 0 && it->first < minExp)
{
minExp = it->first;
}
}
// no negative exponent. f(0) is defined by 0 exponents
if (minExp == 0) return exponents[0];
// minimum exponent is even => positive or negative infinity limit
if (minExp % 2 == 0)
{
return exponents[minExp] > 0
? numeric_limits<double>::infinity()
: -numeric_limits<double>::infinity();
}
// minimum exponent is odd => f(0) limits approach both positive AND negative infinity
return numeric_limits<double>::quiet_NaN();
}
我正在写一个 class,它根据常量数组 a 和指数数组 b 吐出多项式,这样生成这个等式:
但是这个方程没有f(0)的解,但是可以用两边的极限来计算(假设它们是相等的)。你怎么能用 C++ 实现这个,因为我完全不知道从哪里开始。
编辑
感谢您的评论(我还不能评论)。我写代码确实有点太快了,但我还是想自己写函数,因为这正是我想学的东西。
希望这段代码对您有所帮助
#include <iostream>
#include <math.h>
double F(int X)
{
const int numOfSentence = 3;
double a[numOfSentence] = { 2,4,6 };
double b[numOfSentence] = { 1,2,-1 };
double result = 0;
for (int i = 0; i < numOfSentence; i++)
{
result += a[i] * pow(X, b[i]);
}
return result;
}
int main()
{
std::cout << F(2);
}
通常,f(0)
的限制将仅取决于归一化多项式的最小指数。
归一化多项式(我称之为)是多项式,其中属于重复 b
值的所有 a
值相加,只有非零 [=12] =] 值被保留。
- 如果最小的指数大于0,则
f(0) = 0
- 如果最小的指数为0,对应的
a
值就是f(0)
的结果
- 如果最小指数小于0,则极限为正and/or负无穷大
- 即使是最小的指数也意味着上下限方向相同
- 奇数最小指数表示上下限方向相反
此方法仅适用于整数 b
。至少我没有调查其他案例的所有细节。
#include <iostream>
#include <limits>
#include <map>
using namespace std;
double f0(int* a, int* b, int n);
int main()
{
int a[] = {2, 4, 6, -2, 5, -4};
int b[] = {2, 1, -1, -1, 0, -1};
// number of values in array a and b
int n = 6;
double result = f0(a, b, n);
cout << "f(0) = " << result << endl;
return 0;
}
double f0(int* a, int* b, int n)
{
map<int, int> exponents;
for (int i = 0; i < n; ++i)
{
exponents[b[i]] += a[i];
// debug printing intermediate sums per exponent
cout << b[i] << ": " << exponents[b[i]] << endl;
}
int minExp = 0;
for (auto it = exponents.begin(); it != exponents.end(); ++it)
{
if (it->second != 0 && it->first < minExp)
{
minExp = it->first;
}
}
// no negative exponent. f(0) is defined by 0 exponents
if (minExp == 0) return exponents[0];
// minimum exponent is even => positive or negative infinity limit
if (minExp % 2 == 0)
{
return exponents[minExp] > 0
? numeric_limits<double>::infinity()
: -numeric_limits<double>::infinity();
}
// minimum exponent is odd => f(0) limits approach both positive AND negative infinity
return numeric_limits<double>::quiet_NaN();
}