- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是新来的,也是编程的初学者。
对于一个小型的私有(private)使用项目,我想计算各种多项式模型的系数。一种数据集的 polyfit。
// X = vector that stores values of sigma(xi^2n)
std::vector<TYPE> X(tnp1);
for (int i = 0; i < tnp1; ++i) {
X[i] = 0;
for (int j = 0; j < N; ++j)
X[i] += (TYPE)pow(x.get(j), i);
}
正态多项式的原始值。
// X = vector that stores values of sigma(xi^2n)
std::vector<TYPE> X(tnp1);
for (int i = 0; i < tnp1; i+2) {
X[i] = 0;
for (int j = 0; j < N; ++j)
X[i] += (TYPE)pow(x.get(j), i);
}
下一个是奇数
// X = vector that stores values of sigma(xi^2n)
std::vector<TYPE> X(tnp1);
for (int i = 1; i < tnp1; i+2) {
X[i] = 0;
for (int j = 0; j < N; ++j)
X[i] += (TYPE)pow(x.get(j), i);
}
这个片段也是一样的:
// Y = vector to store values of sigma(xi^n * yi)
std::vector<TYPE> Y(np1);
for (int i = 0; i < np1; ++i) {
Y[i] = (TYPE)0;
for (int j = 0; j < N; ++j) {
Y[i] += (TYPE)pow(x[j], i)*y[j];
}
}
我无法验证结果。至少我不知道怎么做。
最佳答案
如果您的拟合函数相对于估计系数是线性的,则可以使用线性最小二乘算法作为一般方法。我将使用 alglib对于示例,但任何 C++ 数学库也应该完成这项工作。
您的拟合函数可以表示为
f(t) = c0 * f0(t) + c1 * f1(t) + c2 * f2(t) + ...
在哪里(在您的偶数多项式示例中)您的 fx 可以是
f0 = constant
f1 = t^2
f2 = t^4
有了它,您可以定义
Least Squares问题:
A * c - y ---> min
在哪里
A
是您在不同时间点拟合 f(t) 曲线值的矩阵
A = [[f0(t0), f1(t0), f2(t0)],
[f0(t1), f1(t1), f2(t1)]
[f0(t2), f1(t2), f2(t2)],
...
[f0(tn), f1(tn), f2(tn)]];
c
是要估计的系数 vector ,
y
是您测量的值(
y
和
t
是您对算法的输入)。
alglib::lsfitlinear
来解决:
const size_t numPoints(1000);
double p0(-1000);
double p2(-5.5);
double p4(1.1);
std::vector<double> t(numPoints);
std::generate(t.begin(), t.end(), [i = 0]() mutable { return 0.001*i++; });
std::random_device rd{};
std::mt19937 gen{rd()};
std::normal_distribution<> gauss{0, 0.5}; // let's apply some noise
std::vector<double> y(numPoints);
// generate fake data
std::generate(y.begin(), y.end(), [i = 0, &t, &gauss, &gen, p0, p2, p4]() mutable {
double result = p0 + p2*std::pow(t[i], 2) + p4*std::pow(t[i], 4);
result += gauss(gen);
i++;
return result;
});
alglib::real_1d_array y_array;
alglib::real_1d_array t_array;
alglib::real_2d_array F_array;
y_array.setcontent(y.size(), y.data());
t_array.setcontent(t.size(), t.data());
// LS array for 3 basis functions: f0 = 1, f1 = x^2, f2 = x^4
F_array.setlength(numPoints, 3);
std::normal_distribution<> gauss2{1, 1};
for (size_t i = 0; i < numPoints; i++)
{
F_array(i, 0) = 1;
F_array(i, 1) = std::pow(t[i], 2);
F_array(i, 2) = std::pow(t[i], 4);
}
alglib::ae_int_t info;
alglib::real_1d_array coeffs;
alglib::lsfitreport rep;
alglib::lsfitlinear(y_array, F_array, numPoints, 3, info, coeffs, rep);
std::cout << "Success: " << info << std::endl;
std::cout << "Results: " << coeffs(0) << ", " << coeffs(1) << ", " << coeffs(2) << std::endl;
std::cout << "RMS: " << rep.rmserror << std::endl;
但是,对于较大的值,这种方法可能会在数值上变得不稳定。尝试设置更大的时间值,看看结果会比下面的替代方法更差。请注意,您的矩阵是
Vandermonde matrix ,因此时间值分布在 Y 轴两侧将变得不可逆,因为您只使用偶数指数系数。示例结果:
Success: 1
Results: -1000.04, -5.45533, 1.19111
RMS: 0.479453
tp <--- t^2
并将您的问题改造成具有函数的标准多项式拟合
f(t) = C + t^2 + t^4 = c + tp + tp^2
并使用
alglib::polynomialfit
使用二阶多项式(
m=3
在 alglib 中):
alglib::barycentricinterpolant p;
alglib::polynomialfitreport rep2;
for (size_t i = 0; i < numPoints; i++)
{
// substitution: new t is equal to old t^2
t_array(i) = std::pow(t_array(i), 2);
}
alglib::polynomialfit(t_array, y_array, 3, info, p, rep2);
alglib::real_1d_array powerCoeffs;
alglib::polynomialbar2pow(p, powerCoeffs);
std::cout << "Success: " << info << std::endl;
std::cout << "Results: " << powerCoeffs(0) << ", " << powerCoeffs(1) << ", " << powerCoeffs(2) << std::endl;
std::cout << "RMS: " << rep2.rmserror << std::endl;
示例结果(在这种情况下它们是相同的,但通常该算法表现更好):
Success: 1
Results: -1000.04, -5.45533, 1.19111
RMS: 0.479453
alglib::polynomialfit
很好,因为它使用重心插值,这在数值上更稳定。
关于c++ - c++中具有奇数和偶数指数的多项式函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63035399/
我的任务是编写一个java程序,首先询问用户将输入多少个数字,然后输出输入的奇数和偶数个数。它限制为整数 0-100。我的问题是:我的代码中缺少什么? import java.util.Scanner
我正在寻找有关 VBA 脚本的帮助。我一直在试图弄清楚如何使用 mod 功能。 这是我到目前为止所做的: Function AddOddNumbersWithMod(nr) Dim i, su
我只是想从 .NET 调用 kernel32 中的 GetPrivateProfileString 和 GetPrivateProfileSection,但遇到了一些我不明白的奇怪问题。 让我们从这个
我需要做的是在列表中交替应用 2 个函数。例如: (*2) (-3) [4,5,6,7,8] 会导致[8,2,12,4,16] , 因为 4*2 , 5-3 , 6*2 , 7-3 , 8*2 ...
我尝试在 JavaScript 中创建一个函数来判断一个数字是否为偶数,或者它是否是一个数字。我收到此错误: 这是 CodeCademy 中的类(class)。 最佳答案 您正在检查函数 isNaN
当我运行此命令时,不会打印任何内容,我尝试根据用户输入的内容打印一条消息,显示奇数或偶数。 import java.util.Scanner; public class Questions {
我必须编写一个程序来读取 3 个数字(使用输入框),并根据它们的值写入以下消息之一: 所有 3 个数字都是奇数或 所有 3 个数字都是偶数或 2 个数字是奇数,1 个数字是偶数或 1 个数字是奇数
我正在构建一个谷歌图像搜索的示例。我有一个图像网格(搜索结果)。当单击其中一张图像时,我正在使用 jquery 创建的部分标记中加载 html 文档。奇怪的是,如果你查看开发人员工具,html 已加载
我试图仅在偶数行上打印单词 * Even * ,而不包括第一行和第二行(最终不包括最后两行),但它打印 15 行,然后在整个过程中随机打印 * Even * 。使用 6 表示宽度,使用 15 表示高度
我有一个数学函数,它取决于由 给出的三个变量 {n、a 和 b} {a = n+1, b=n} 当 n 为偶数时 {b = n+1, a=n} 当 n 为奇数时 我的函数被调用了很多 次,n 各不相同
我有一个查询,其中有一个条件来检查房间号是否为奇数/偶数。问题在于房间号与建筑物信息一起存储在字符串中。 以下是数据库中数据的格式: ABC-0101A (Odd) ABC-0112B (Even
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我有一个包含类似内容的页面。 ################################# # __________________________ # # | |
这个问题在这里已经有了答案: Can I combine :nth-child() or :nth-of-type() with an arbitrary selector? (9 个回答) Ho
我正在尝试了解这个素数分解的特定解决方案(取自 http://rosettacode.org/wiki/Prime_decomposition#Python:_Using_floating_point
我知道这可能是一个愚蠢而简单的问题,但我对编程还很陌生。我有以下关于我在一个程序中看到的 if 运算符的问题。这是代码: d= -12.4; if(d) printf("%d \n", abs
我正在尝试制作一个脚本,根据天气情况输出用户名,他们被分配奇数或偶数值。我想我已经设法让奇数的工作,但偶数的不会输出。这是它的样子。 'commentid' 是确定将它们分配给奇数还是偶数的值。 ";
我的 NPE 的 Stacktrace 开始于: Caused by: java.lang.NullPointerException at pl.yourvision.crm.web.serv
我正在尝试查找给定数字(用户输入)是偶数还是奇数。 I'm simply applying AND operation on binary digits of a no. with 1, If the
有谁知道用于可变范围的桶的哈希函数(对于字符串,如果它重要的话),它总是奇数(或质数,如果需要的话)? 本质上,我正在寻找一个散列函数,它将在 n 个桶上提供均匀分布,其中 n 是奇数(或质数,因为
我是一名优秀的程序员,十分优秀!