优化后,我使用 Python 和 C++ 中的最佳参数计算残差。结果差距巨大。以下是我更准确地进行操作的方法:
我根据 Python 中的参数模型生成数据。我将 X 和 Y 存储在 Excel 文件中。我将此文件加载到我的 C++ 程序中并运行优化。我提出了最佳参数,它们与用于生成该系列的参数非常接近。然后,我使用 Python 和 C++ 计算残差(Y 与具有最佳参数的模型输出之间的平方差之和)。结果是巨大的,对于对参数变化非常敏感的模型,差异高达 10^3。这些差异是否可以归因于 Python 和 C++ 中处理精度的不同方式,或者是否还有其他问题?优化完成后,残差计算就是一个简单的计算,我想知道如果不是精度问题,问题可能出在哪里。
非常感谢您的任何建议或参考。
编辑 --- 我可以轻松地显示用于生成数据和计算残差平方和的 Python 代码,但不能显示 C++ 代码,因为计算是通过解释器执行的。感谢您的任何评论。
P1 = 5.21
P2 = 0.22
X_= list(range(0,100,1))
X=[float(x)/float(10) for x in X_]
Y = [P1*numpy.exp(-1*P2*x) for x in X]
##plt.plot(X,Y)
##plt.show()
##for j in range(len(Y)):
## Y[j]+=rg.normal(0,0.01)
#build some input files
X1f = open('F:\WORK\SOLVEUR\ALGOCODE\PYTHON_\DataSets\exponential1X.txt', 'w')
for i in range(len(X)):
X1f.write(str(X[i])+'\n')
X1f.close()
Yf = open('F:\WORK\SOLVEUR\ALGOCODE\PYTHON_\DataSets\exponential1Y.txt', 'w') …Run Code Online (Sandbox Code Playgroud) Excel上瘾的简单问题:
=0.23-0.0373*SIN(B2-PI)
X Y
0 0.24 #NAME?
0.1 -0.758334166 #NAME?
0.2 -1.746693308 #NAME?
0.3 -2.715202067 #NAME?
Run Code Online (Sandbox Code Playgroud)
不起作用(右栏),为什么会这样?
不知道为什么不应该那样工作,但鼠标的信息显示这种语法.
还检查了语法,并且......没有任何线索.
感谢致敬.
这个语法是double x[]什么?
它是一种声明数组的C方式吗?
如果我有类似的功能
void evaluate(double x[], double *f)
{
// evaluate
}
Run Code Online (Sandbox Code Playgroud)
我可以传递任何长度的参数x吗?
我想NSIS文档例如对于静默安装,在这里.取消注释该行
; SilentInstall silent
Run Code Online (Sandbox Code Playgroud)
然后是的,我的安装程序是沉默的.但是,它会显示消息框.即使安装程序是静默的,预计也会出现消息框.为了使消息框保持静音,必须为每个消息框播放/ SD选项.示例脚本在此处提出:
MessageBox MB_OK|MB_ICONINFORMATION "This is not a silent installer" /SD IDOK
Run Code Online (Sandbox Code Playgroud)
暴露消息框的另一个意思是暴露:它检查是否静默.如果是静音,则向前跳两行(所以不要显示消息框)
IfSilent 0 +2
MessageBox MB_OK|MB_ICONINFORMATION 'This is a "silent" installer'
Run Code Online (Sandbox Code Playgroud)
第二种解决方案对我不起作用.如果我将安装程序设置为静音,则会显示带有"这是静默安装程序"的框.如果我改变它
MessageBox MB_OK|MB_ICONINFORMATION 'This is a "silent" installer' /SD IDOK
Run Code Online (Sandbox Code Playgroud)
消息未出现.
为什么跳进去
IfSilent 0 +2
Run Code Online (Sandbox Code Playgroud)
不工作?+3也没有成功.
我想让我的安装程序保持沉默.我希望能够灵活地使安装程序保持静默或不依赖于命令行选项.在doc中,我发现这可以启动NSIS脚本编译:
"C:\Program Files\NSIS\makensis.exe" "D:\Produts\folder\Install\nsis\MyApp.nsi"
Run Code Online (Sandbox Code Playgroud)
这是有效的.默认情况下,这会生成非静默安装程序.要使用静默安装程序(仅使用命令行选项),我试过这个
"C:\Program Files\NSIS\makensis.exe" \S "D:\Produts\folder\Install\nsis\MyApp.nsi"
Run Code Online (Sandbox Code Playgroud)
但\ S不是公认的选择.如何使用命令行选项使安装程序无声?
我可以在doc中找到它
4.8.1.36 SilentInstall
normal | silent | silentlog指定安装程序是否应该是静默的.如果它是'silent'或'silentlog',所有具有SF_SELECTED标志的部分都安静地安装(你可以使用SectionSetFlags设置这个标志),安装程序本身没有屏幕输出(脚本仍然可以显示它想要的任何内容,使用MessageBox的/ SD指定静默安装程序的默认值.请注意,如果将其设置为"normal"并且用户在命令行上使用/ S(区分大小写)运行安装程序,则其行为就像使用了SilentInstall"silent"一样.注意:另请参见LogSet.
有关更多信息,请参见第4.12节.
所以我觉得被虐待了
或者是否应该将一些指令添加到NSIS脚本中,以便编译可以接受/ S选项?
尝试用-S而不是工作.
感谢致敬
我想将一个float**参数列表传递给一些float**只使用C-syle的方法(但我们认为我们可以使用QList<>as参数类型).
我试过了
QList< float** > list_ = new QList< float** >();
Run Code Online (Sandbox Code Playgroud)
但这不起作用.我应该用什么呢?对于二维矩阵列表,Qt容器会是什么?
谢谢
我编写了一个C++例程来查找排序数组中最近的double元素.有没有办法加快?
reversed如果reversed按降序排序,则有两个基于boolean值的分支.
void findNearestNeighbourIndex_new(real_T value, real_T* x, int_T x_size, int_T& l_idx)
{
l_idx = -1;
bool reversed= (x[1] - x[0] < 0);
if ((!reversed&& value <= x[0])
|| (reversed&& value >= x[0])){
// Value is before first position in x
l_idx = 0;
}
else if ((!reversed&& value >= x[x_size - 1])
|| (reversed&& value <= x[x_size - 1])){
// Value is after last position in x
l_idx = x_size - 2;
}
else // All other …Run Code Online (Sandbox Code Playgroud) 我有一些由MATLAB Coder生成的代码.它包括这种类型的一些变量定义:
int tmp_size[400];
Run Code Online (Sandbox Code Playgroud)
在方法范围结束之前,不会显式删除这些变量.
变量是在堆还是堆栈上分配的?这相当于以下几点吗?
int* tmp_size = new int[400];
Run Code Online (Sandbox Code Playgroud)
是否最好用内存管理来重写这些变量定义new,比如int* tmp_size = new int[400];?
我注意到内存是由我的程序分配的,永远不会被释放.这可能是造成内存泄漏的原因吗?
c++ memory-leaks memory-management new-operator matlab-coder
我读了一段写成的代码
for (kf=0; kf<nf; kf++)
if (EPS_MOCK[kf] == 1)
for (i=0; i<nptsx; i++)
for (j=0; j<nptsz; j++)
{
x0[iv] = log(inv_Controls->epsilonBed.GetElem(j,i,kf));
iv = iv+1;
}
for (kf=0; kf<nf; kf++)
if (inv_num_packman[kf] == -1)
for (i=0; i<nzx; i++)
{
x0[iv] = log(inv_Controls->num_packman[i+kf*nzx]);
iv = iv+1;
}
else if (inv_num_packman[kf] == 1)
{
x0[iv] = log(inv_Controls->num_packman[kf*nzx]);
iv = iv+1;
}
Run Code Online (Sandbox Code Playgroud)
而预期的括号设置将是
for (kf=0; kf<nf; kf++){
if (EPS_MOCK[kf] == 1){
for (i=0; i<nptsx; i++){
for (j=0; j<nptsz; j++)
{
x0[iv] = log(inv_Controls->epsilonBed.GetElem(j,i,kf));
iv …Run Code Online (Sandbox Code Playgroud) c++ ×6
algorithm ×2
arrays ×2
installer ×2
nsis ×2
c ×1
calculator ×1
command-line ×1
excel ×1
installation ×1
intel-vtune ×1
list ×1
matlab-coder ×1
memory-leaks ×1
new-operator ×1
object ×1
optimization ×1
parentheses ×1
performance ×1
precision ×1
python ×1
qt ×1
silent ×1
syntax ×1
trigonometry ×1
types ×1