问题描述
背景
我正在尝试创建一个程序,该程序从除法表中创建一个完全简化的牛顿多项式。我已经拥有执行此操作的所有资源,但我对如何使循环正常工作感到困惑。
概念
从概念上讲,我已经确定我有一个从中绘制的 [50][51]
浮点矩阵。我这样做是为了我可以为插值保留 50 个点。当我查看我的程序时,我获取点并将它们设置在矩阵的前两列中,我称之为 difference_matrix
。
一旦我做了它并用我需要的值填充它,我通过从第一行(第 1 行)第二列(列从 1 开始)到最后一列的值并将它们放入拉格朗日系数名为 coefficients
的向量。在生成多项式的函数中,我对第一列中的数字进行外推,并将它们放入另一个名为 matrix_numbers
的向量中。
在我的函数中,我也有两个二项式,它们可以相互乘以形成一个新的多项式。还有一个函数可以将它们与向量相乘以存储具有额外阶数的中间矩阵。
算法
以下是我对要使用的算法的看法:
//Initialize all of the stuff needed
coefficients[0] -> final_matrix[0]
for int i = 1 to coefficients size
when i = 1
set the 0th key of a binomial initialized to {1,1} to -diference_matrix[1][1]
multipply that binomial by the coefficients[1] value **`...+c(-a1 +x)...`**
Add the results to the final_vector
else
when i = 2
multiply binomial 1 with binomal_2 with its 0 key set to -[difference_matrix[2][1]
multiply the result by coefficients and add to the final vector **`...+c(-a1 +x )(-a2 + x) +...`**
else
multiply the results of the prevIoUs step with a new binomial (binomial_2) where binomial_2[0] = - difference_matrix[i][1]. Multiply by coefficients[i]. **`...+c(-a1 +x )(-a2 + x)(-a3 + x) +... + (an + x)`**
add the result to the final vector
print the final vector
代码
makeSmallpoly()
{
const int poly_length = k - 1;
vector<float> binomial_1 = { 1,1 }; vector<float> binomial_2 = { 1,1 }; //binomials to store
vector<float> matrix_numbers;
vector<float> new_poly; //iintermediate polynomial
int size = 2;
vector<float> final_poly; //what we print
for (int i = 0; i < coefficients.size(); ++i)
final_poly.push_back(0);
for (int i = 1; i < k-1; ++i)
matrix_numbers.push_back(difference_matrix[i][0]);
final_poly[0] = coefficients[0];
for (int i = 1; i < coefficients.size(); ++i)
{
if (i == 1)
{
binomial_1[0] = -matrix_numbers[i]; //c(1+x)
final_poly[0] += coefficients[i] * binomial_1[0],final_poly[1] += coefficients[i] * binomial_1[1];
}
else
{
binomial_2[0] = -matrix_numbers[i];
if (i == 2)
new_poly = multiplypolynomial(binomial_1,binomial_2);
else
new_poly = multiplypolynomial(new_poly,binomial_2);
++size;
for (int j = 0; j < new_poly.size(); ++j)
final_poly[j] += coefficients[i] * new_poly[j];
}
}
printVector(final_poly);
}
vector<float> multiplypolynomial(vector<float> poly_1,vector<float> poly_2)
{
vector<float> product(poly_1.size() + poly_2.size() - 1,0);
// Multiply two polynomials term by term
// Take ever term of first polynomial
for (int i = 0; i < poly_1.size(); i++)
{
// Multiply the current term of first polynomial
// with every term of second polynomial.
for (int j = 0; j < poly_2.size(); j++)
product[i + j] += poly_1[i] * poly_2[j];
}
return product;
}
void printVector(vector<float> in_vec)
{
for (int i = in_vec.size(); i >= 0; --i)
{
if (i > 1)
cout << in_vec[i] << "x^" << i << " + ";
else if (i == 1)
{
cout << in_vec[i] << "x" << " + ";
}
else
cout << in_vec[i] << "\n";
}
}
结果
使用点 (1,3),(1.5,3.25),(0,(2,1.66667)
,我得到多项式 -2x^3 + 3.333333x^2 + 2.25
。应该是 -2x^3 + 5.325x^2 -3.32833x + 3
。
我该如何用我的程序解决这个问题?任何建议都会有很大帮助!
--谢谢!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)