- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我需要从 n+1 个数据点得到一个 n 次函数。通过使用以下 gnuplot 脚本,我得到了正确的拟合:
f(x) = a + b*x + c*x**2 + d*x**3 + e*x**4 + f*x**5 + g*x**6 + h*x**7 + i*x**8 + j*x**9 + k*x**10 + l*x**11 + m*x**12
# Initial values for parameters
a = 0.1
b = 0.1
c = 0.1
d = 0.1
e = 0.1
f = 0.1
g = 0.1
h = 0.1
i = 0.1
j = 0.1
k = 0.1
l = 0.1
m = 0.1
# Fit f to the following data by modifying the variables a, b, c
fit f(x) '-' via a, b, c, d, e, f, g, h, i, j, k, l, m
4.877263 45.036000
4.794907 44.421000
4.703827 43.808000
4.618065 43.251000
4.530520 42.634000
4.443111 42.070000
4.357077 41.485000
4.274298 40.913000
4.188404 40.335000
4.109381 39.795000
4.027594 39.201000
3.946413 38.650000
3.874360 38.085000
e
拟合后得到如下系数:
a = -781956
b = -2.52463e+06
c = 2.75682e+06
d = -553791
e = 693880
f = -1.51285e+06
g = 1.21157e+06
h = -522243
i = 138121
j = -23268.8
k = 2450.79
l = -147.834
m = 3.91268
然后,通过将数据和 f(x) 一起绘制,似乎给定的系数是正确的:
但是,我需要使用 C 代码来获得这样的拟合。在某些情况下,多项式拟合 ( as in this link ) 的 GNU 科学图书馆代码结果正确。但是对于上述数据(以及我数据集中的其他几个案例),我得到的结果是有缺陷的。
例如,以下代码(使用与上述示例相同的数据):
void testOfPolynomialFit(){
double x[13] = {4.877263, 4.794907, 4.703827, 4.618065, 4.530520, 4.443111, 4.357077, 4.274298, 4.188404, 4.109381, 4.027594, 3.946413, 3.874360};
double y[13] = {45.036000, 44.421000, 43.808000, 43.251000, 42.634000, 42.070000, 41.485000, 40.913000, 40.335000, 39.795000, 39.201000, 38.650000, 38.085000};
double coefficients[13];
polynomialfit(13, 13, x, y, coefficients);
int i, n = 13;
for (i = 0; i < n; i++)
{
printf("%lf\t", coefficients[i]);
}
printf("\n");
}
结果:
-6817581083.803348 12796304366.105989 -9942834843.404181 3892080279.353104
-630964566.517794 -75914607.005088 49505072.518952 -5062100.000931
-1426228.491628 514259.312320 -70903.844354 4852.824607
-136.738756
对应于以下形式的函数:
c(x)=-6837615134.799868+12834646330.586414*x**1-9973474377.668280*x**2+3904659818.834625*x**3-633282611.288889*x**4-76066283.747942*x**5+49670960.939126*x**6-5091123.449217*x**7-1426628.818192*x**8+515175.778491*x**9-71055.177018*x**10+4863.969973*x**11-137.065848*x**12
可以在这里检查 c(x) 的样子:
在这样的图像中,a(x) 和 b(x) 是使用“多项式拟合”拟合的函数,仅针对少数几个点(4 和 7)。
那么,关于我在这里做错了什么有什么提示吗?还有一些其他的 C 代码可以提供合适的配件吗?
最佳答案
这两种解决方法之间的一个主要区别是,当您使用 gnuplot 时,您正在执行 fit
以在同一程序中设置系数并从那里绘制函数,而使用 GSL您正在将数字从一个程序复制到另一个程序。
如果您使用 printf("%lf", ...)
的输出作为您的第二个 gnuplot 程序的输入,您会失去很多准确性,因为 printf
对数字的舍入方式比任何一个程序的任何内部操作都要多。因为这是一个数值不稳定的问题,所以一点点四舍五入会造成很大的伤害。
当 x
为 4.877263 时,x**12
大约为 181181603.850932 所以如果您的 m
偏离 0.000001
(printf 的默认舍入级别)引入了 181.181603850932 的错误,相对于 x
的实际 y
值大约 300% 的相对错误。
尝试 %.60lf
,看看它是否变得更好。
如果其中一个程序在内部使用 long double 而另一个程序没有,那么无论您做什么,您都可能无法获得良好的匹配。
关于c - 使用 GNU Scientific C 的多项式拟合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27825951/
我正在运行 yum install gcc-arm-linux-gnueabi 在我的机器上,但它说: No package gcc-arm-linux-gnueabi available. 请帮我在
在为特定学科的科学家设计软件库时,有哪些好的原则?我的意思是化学、物理、 Material 科学、显微镜、生物测定、天文学等领域。我不包括 SciPy、R、Matlab、JAMA 等涵盖一系列学科或专
是否有任何通用物理引擎可以对刚体进行大规模模拟?我正在使用 Nvidia 的 PhysX,但该引擎的重点是游戏开发、软体。我想知道是否存在运行在 PS3 单元处理器或 CUDA 内核之上的物理引擎,允
首先: 我很清楚OpenCL不能神奇地使一切变得更快 我很清楚OpenCL有限制 所以现在我的问题是,我习惯于使用编程来进行不同的科学计算。关于计算的复杂性和数量,我从事的一些工作非常紧张。所以我想知
我在美国一所大学的一个小型独立科学实验室工作,我注意到,与业内许多表面上遵循的做法相比,例如每天检查版本控制系统,使用对于所有语言(如 emacs)等的单个 IDE/编辑器,我们遵循相当粗劣的编程实践
由于不明原因(我需要匹配古代 Fortran 代码中使用的某些格式),我需要使用 VBA(到文本文件)从 Excel 输出一些非标准科学记数法的数字。 例如如果 x = 6000000 普通VBA:
除了产生不正确的结果外,科学编程中最担心的问题之一就是无法复制您生成的结果。哪些最佳实践可帮助确保您的分析可重复? 最佳答案 我是研究地球物理学家团队中的一名软件工程师,我们目前(一如既往)致力于提高
我正在将大量小数据集写入 HDF5 文件,生成的文件大小大约是我对输入的数据的原始列表所期望的 10 倍。我的数据按层次结构组织如下: group 0 -> subgroup 0
是否有机会在 Spyders 变量资源管理器中将这些转换为非科学记数法?谢谢! 最佳答案 点击格式并将 float 格式设置为 %.15g 对我有用。 关于Spyder 变量资源管理器 : Disab
我正在尝试使用 GSL 进行最小二乘拟合,但我什至无法生成 example正常运行。可以编译,但是运行程序时会报错 dyld: lazy symbol binding failed: Symbol n
Scientific Linux 上的 Java 安装程序显示了两个不同的版本。 我正在尝试在 Scientific Linux 上正确设置 java。 如果我执行 javac -version 我会
我有一个 h:inputText 控件,我可以在其中输入最多 7 位数字,并将它们转换为十进制表示形式(即输入“9999999”,它将呈现“9999999.0”)。但是,当我输入任何 7 位或更多数字
科学记数法定义了数字应该如何使用符号、数字和指数来显示,但它没有声明可视化是标准化的。 一个例子:-2.34e-2(归一化科学计数法)与-0.234e-1(科学计数法)相同 我能否依赖以下代码始终生成
我需要从 n+1 个数据点得到一个 n 次函数。通过使用以下 gnuplot 脚本,我得到了正确的拟合: f(x) = a + b*x + c*x**2 + d*x**3 + e*x**4 + f*x
这是一个 MWE: #include int main() { std::cout.precision(17); std::cout << 1.2345678901234567890
我正在尝试在 numpy 中使用 genfromtxt 导入一个包含文本和数字的大型 .csv 文件。我只对两列感兴趣。我已经整理了大部分导入: def importfile(root): d
我想以科学记数法将数字写入 Excel。在 Apache Poi 中,可以像这样设置单元格的数字格式: Cell cell = ... CellStyle style = workbook.creat
我正在使用 Scientific Linux 6.1。要运行程序 (DS9),我需要设置此环境变量: export XPA_METHOD=local 所以我把它保存在 .bashrc 中,当我从 ba
我看到所有的例子都说要使用 fixed、precision 等,但所有这些都是人们想要打印值的时候。 我想做的是将我的 double 值从数字转换为字符串,我不需要科学记数法。 我的数字示例:6.61
我刚刚使用 conda create --name py35 python=3.5 anaconda 将 python 3.5 添加到 anaconda 的环境中 我把anaconda的bin、env
我是一名优秀的程序员,十分优秀!