我有一组由计算机代数系统(CAS)产生的多项式表达式.例如,这是该集合的一个元素.
-d*d*L*L*QB*B*L*L*Q + 2*d*F*Ĵ*L*Q + 2*b*表F*H*L*QF*F*Ĵ*Ĵ*QB*b*表Ĵ*∫*q + 2*b*表d*H*Ĵ*QF*F*H*H*QD*d*H*H*q + b*b*∫*∫*○*O-2*b*d*H*Ĵ*○*O + d*d*H*H*○*0-2*b*b*∫*L*N*O + 2*b*表d*H*L*n个*O + 2*b*表F*H*Ĵ*N*0-2*d*F*H*H*N*O + 2*b*表d*∫*L*M*0-2*d*d*H*L*M*0-2*b*表F*Ĵ*∫*M*O + 2*d*F*H*Ĵ*M*O + b*b*L*L*N*N-2*b*表F*H*L*N*N + F*F*H*H*N*N-2*b*表d*L*L*m*n个+ 2*b*表F*Ĵ*L*米*N + 2*d*F*H*L*m*n个-2*F*F*H*Ĵ*m*n个+ d*d*L*L*m*m的-2*d*F*Ĵ*L*M*M + F*F*Ĵ*Ĵ*m*m的
我需要尽快在C程序中执行所有这些操作.如果你仔细研究这些公式中的任何一个,很明显我们可以优化它们的计算速度.例如,在上面粘贴的多项式中,我可以立即看到术语-d*d*l*l*q,2*d*f*j*l*q和-f*f*j*j*q,这样我就可以用-q*square(d*lf*j)替换它们的总和.我相信这里可以做很多这样的事情.我不相信(但也许我错了)任何编译器都能找到这个优化,或者更高级的优化.我试图让maxima(一个CAS)为我做这个,但没有任何结果(因为我是极限初学者,我可能错过了一个神奇的命令).所以,我的第一个问题是:我们可以使用什么工具/算法来优化多项式表达式以获得计算速度?
当优化一组共享大多数变量的多项式表达式时,事情变得更加复杂.实际上,通过表达式优化表达式可能是次优的,因为在优化之前编译器可以识别公共部分,但是如果不作为整体执行则不再存在.所以,我的第二个问题是:我们可以使用哪些工具/算法来优化一组多项式表达式以获得计算速度?
最好的祝福,
PS:这篇文章与" 计算机代数软件以及最小化一组多项式中的操作数量 "有一些相似之处,但是那一点给出的答案指向CAS程序而不是说我们如何使用它们来实现我们的目标.
algorithm optimization performance computer-algebra-systems polynomials
import sympy as S
F = S.FiniteField(101)
Run Code Online (Sandbox Code Playgroud)
当我打电话时,f = S.poly(y ** 2 - x ** 3 - x - 1,F)
我收到以下错误:
'FiniteField'对象没有属性'is_commutative'
但有限域是定义的可交换的!所以我不确定这个错误应该是什么意思!
有没有人遇到过这个?如何在有限域上声明多项式?
我试图将包含具有不同程度的符号变量的项的表达式转换为z_s
python中的多项式,sympy.Poly()
以便我可以使用提取系数.coeffs()
.
我所拥有的表达式是具有独立符号变量z_s的高阶多项式.出于某种原因,当我使用sympy.Poly()将表达式转换为多项式时,似乎用小系数来切断项.下面是我的函数,我在其中包含了将其重新定义为符号多项式的行:
f = -1.29096669270427e-61*z_s**33 + 6.24438995041203e-59*z_s**32 - 6.41125090009095e-57*z_s**31 - 8.30852813320818e-55*z_s**30 + 5.84175807723288e-53*z_s**29 + 1.88577332997761e-50*z_s**28 + 9.46504910106607e-49*z_s**27 - 2.28903644846359e-46*z_s**26 - 4.63321594171589e-44*z_s**25 - 1.78254194888339e-42*z_s**24 + 6.43406800910469e-40*z_s**23 + 1.20425521347205e-37*z_s**22 + 3.4116753522246e-36*z_s**21 - 1.92084369416715e-33*z_s**20 - 3.04107684362554e-31*z_s**19 + 2.89289551256439e-30*z_s**18 + 6.38382842182985e-27*z_s**17 + 5.46438700248253e-25*z_s**16 - 8.50501280745176e-23*z_s**15 - 1.6344595302306e-20*z_s**14 + 1.07764488797684e-18*z_s**13 + 3.47026242660686e-16*z_s**12 - 2.93966702403133e-14*z_s**11 - 5.25394006214533e-12*z_s**10 + 1.21642330162702e-9*z_s**9 - 1.16577645027166e-7*z_s**8 + 6.82117624588787e-6*z_s**7 - 0.000267513120031891*z_s**6 + 0.00723589681411793*z_s**5 - 0.134846078975788*z_s**4 + 1.69035817278476*z_s**3 - 13.5277365002646*z_s**2 + 62.3459673862853*z_s - 76.5029927727737
sympy.Poly(f,z_s)
Run Code Online (Sandbox Code Playgroud)
返回:
Poly(-2.93966702403133e-14*z_s**11 …
Run Code Online (Sandbox Code Playgroud) 使用poly
R中的函数,如何评估多元多项式?
poly()
输出对象(正交或原始多项式)的输出.这样我就可以使用多项式生成一个类似于我的模型矩阵的行,我可以用它来评估结果(即,我试图通过调用推送多变量测试数据值,poly()
以便可以类似于我的回归方法矩阵的一行).poly()
和R的回归程序相对较新. (A):直接接近 predict
这种方法失败了,显然是由于一些意想不到的输入类别.我知道这些特殊的x1和x2值是共线的,对于一般的拟合来说并不理想(我只是想让predict
机器运转起来).使用的predict
灵感来自这篇 SO帖子. (Q1)是否可以predict
直接调用该方法来评估该多项式?
> x1 = seq(1, 10, by=0.2)
> x2 = seq(1.1,10.1,by=0.2)
> t = poly(cbind(x1,x2),degree=2,raw=T)
> predict(t,newdata=data.frame(x1=2.03,x2=2.03))
Error in UseMethod("predict") :
no applicable method for 'predict' applied to an object of class "c('matrix', 'double', 'numeric')"
Run Code Online (Sandbox Code Playgroud)
(B)直接评估仅适用于原始多项式(非正交)
由于(A),我尝试了直接调用poly()的变通方法.对于原始多项式,我可以让它工作,但我必须为每个相应的变量重复数据.以下显示(第一个)单个数据点的失败,(第二个)重复该值的成功. (Q2)有没有办法避免第二个清单中冗余重复数据以使原始poly()
评估正确?
> poly(cbind(x1=c(2.03),x2=c(2.13)),degree=2,raw=T)
Error in `colnames<-`(`*tmp*`, value = apply(z, 1L, function(x) …
Run Code Online (Sandbox Code Playgroud) 多项式的度数应该是# of points - 1
例如,如果有2个点,则它应该是一条线.
我知道我可以用矩阵来解决这个问题
例如,如果有4个点:
多项式将是y = ax^3 + bx^2 + cx + d
,矩阵将是
| y0 | | x0^3 x0^2 x0 1 | | a |
| y1 | = | x1^3 x1^2 x1 1 | x | b |
| y2 | | x2^3 x2^2 x2 1 | | c |
| y3 | | x3^3 x3^2 x3 1 | | d |
Run Code Online (Sandbox Code Playgroud)
我可以解决a,b,c,d.是否有一个库可以执行此操作,输入为点{x0,y0}到{xn,xn}?
numpy.polynomial.polynomial.Polynomial按递增程度的顺序存储多项式系数,而numpy.poly1d按递减程度的顺序存储多项式系数.
有这种差异的原因吗?两种方法都有优势吗?
我目前有一个文本文件如下:
3 5 6 9
3 4 6 7 2
3 5 7 2 5 3
Run Code Online (Sandbox Code Playgroud)
读入java时的文件应显示为3x ^ 5 + 6x ^ 9.第二行将被读作4x ^ 4 + 6x ^ 7 + 2.由于我不知道如何将这些数字转换为该形式,因此无法让我的程序显示.当我运行程序时,我目前只得到它们之间有空格的数字.
这是我尝试过的:
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import javax.swing.JOptionPane;
public class Driver {
public static void main(String[] args) {
try {
@SuppressWarnings("resource")
Scanner myfile = new Scanner(new File("poly.dat"));
Polynomial[] mypolynomial;
mypolynomial = new Polynomial[10];
int index = 0;
if (myfile.hasNext() == true) { //ignore this part
myfile.nextLine();
} else …
Run Code Online (Sandbox Code Playgroud) 我从我的数据中找到了多项式系数:
R <- c(0.256,0.512,0.768,1.024,1.28,1.437,1.594,1.72,1.846,1.972,2.098,2.4029)
Ic <- c(1.78,1.71,1.57,1.44,1.25,1.02,0.87,0.68,0.54,0.38,0.26,0.17)
NN <- 3
ft <- lm(Ic ~ poly(R, NN, raw = TRUE))
pc <- coef(ft)
Run Code Online (Sandbox Code Playgroud)
所以我可以创建一个多项式函数:
f1 <- function(x) pc[1] + pc[2] * x + pc[3] * x ^ 2 + pc[4] * x ^ 3
Run Code Online (Sandbox Code Playgroud)
例如,采取衍生物:
g1 <- Deriv(f1)
Run Code Online (Sandbox Code Playgroud)
如何创建一个通用函数,以便不必为每个新的多项式程度重写它NN
?
我试图了解如何使用scikit-learn(或其他模块)复制R中的poly()函数.
例如,假设我在R中有一个向量:
a <- c(1:10)
Run Code Online (Sandbox Code Playgroud)
我想生成三次多项式:
polynomial <- poly(a, 3)
Run Code Online (Sandbox Code Playgroud)
我得到以下内容:
1 2 3
[1,] -0.49543369 0.52223297 -0.4534252
[2,] -0.38533732 0.17407766 0.1511417
[3,] -0.27524094 -0.08703883 0.3778543
[4,] -0.16514456 -0.26111648 0.3346710
[5,] -0.05504819 -0.34815531 0.1295501
[6,] 0.05504819 -0.34815531 -0.1295501
[7,] 0.16514456 -0.26111648 -0.3346710
[8,] 0.27524094 -0.08703883 -0.3778543
[9,] 0.38533732 0.17407766 -0.1511417
[10,] 0.49543369 0.52223297 0.4534252
Run Code Online (Sandbox Code Playgroud)
我是python的新手,我正在尝试了解如何利用PolynomiaFeatures
sklearn中的函数来复制它.我花了一些时间查看PolynomialFeatures
文档中的示例,但我仍然有点困惑.
任何见解将不胜感激.谢谢!
我对R和统计有一点疑问。
我使用最大似然法对模型进行拟合,该模型为我提供了以下系数以及各自的标准误差(除了其他参数估计值):
ParamIndex Estimate SE
1 a0 0.2135187 0.02990105
2 a1 1.1343072 0.26123775
3 a2 -1.0000000 0.25552696
Run Code Online (Sandbox Code Playgroud)
从我可以画出的曲线:
y= 0.2135187 + 1.1343072 * x - 1 * I(x^2)
Run Code Online (Sandbox Code Playgroud)
但是从那以后,我现在必须计算该曲线周围的置信区间,而且我不清楚如何做到这一点。
显然,我应该使用传播或错误/不确定性,但是我发现的方法需要原始数据,或者不仅仅是多项式公式。
当估计的SE已知为R时,有什么方法可以计算曲线的CI?
谢谢您的帮助。
编辑:
所以,现在,我有了函数的协方差表(v)vcov
:
a0 a1 a2
a0 0.000894073 -0.003622614 0.002874075
a1 -0.003622614 0.068245163 -0.065114661
a2 0.002874075 -0.065114661 0.065294027
Run Code Online (Sandbox Code Playgroud)
和n = 279
。
polynomials ×10
python ×4
r ×4
coefficients ×2
java ×2
regression ×2
sympy ×2
algorithm ×1
derivative ×1
finite-field ×1
function ×1
matrix ×1
numpy ×1
optimization ×1
orthogonal ×1
performance ×1
scipy ×1