在区间集合上评估多项式函数的代码实现问题
区间迭代报错修复与多项式计算优化实现
问题背景
需要将两组数值xl=linspace(0.,1,1000)和xu=linspace(0.,1,1000)+0.5组成成对区间,在每个区间上运行多项式函数,并将结果以嵌套列表形式存储。运行代码时触发无法对区间对象进行迭代的报错,原代码如下:
# Variables xl=linspace(0.,1,1000) xu=linspace(0.,1,1000)+0.5 M=[] # 存储区间的列表 Values=[] # 存储多项式函数输出的列表 class Interval: def __init__(self,left,right): self.left=left self.right=right def __repr__(self): return'[{},{}]'.format(self.left,self.right) def BuildIntervalFromLists(x,y): # 构建区间列表 for i, j in zip(x, y): M.append(Interval(i,j)) return M def Polynomial(t): # 多项式函数 return 3*t**3-2*t**2-5*t-1 def PolynomialFunction(x): # 在所有区间上运行的函数 for k in x: # 遍历每个区间 for l in k: # 遍历区间内的每个数值 Values.append([Polynomial(l)]) return(Values) BuildIntervalFromLists(xl,xu) PolynomialFunction(M)
报错原因
自定义的Interval类未实现迭代器协议,直接用for l in k(k为Interval实例)会触发迭代错误。此外,原代码未明确“在区间上运行函数”的逻辑:是对区间内的采样点计算,还是仅用区间端点?从需求看,应为前者。
修复与优化方案
方案1:保留原类结构,修复迭代逻辑
补全区间采样逻辑,通过Interval对象的left和right属性生成采样点:
# 补全numpy导入 from numpy import linspace # Variables xl=linspace(0.,1,1000) xu=linspace(0.,1,1000)+0.5 M=[] Values=[] class Interval: def __init__(self,left,right): self.left=left self.right=right def __repr__(self): return'[{},{}]'.format(self.left,self.right) def BuildIntervalFromLists(x,y): for i, j in zip(x, y): M.append(Interval(i,j)) return M def Polynomial(t): return 3*t**3-2*t**2-5*t-1 def PolynomialFunction(x): for interval in x: # 从区间左到右生成1000个采样点 t_samples = linspace(interval.left, interval.right, 1000) # 当前区间的计算结果作为子列表存入Values interval_values = [Polynomial(t) for t in t_samples] Values.append(interval_values) return Values BuildIntervalFromLists(xl,xu) result = PolynomialFunction(M)
方案2:简化实现,移除冗余类定义
无需自定义Interval类,直接用zip配对xl和xu生成区间元组,代码更简洁:
from numpy import linspace xl=linspace(0.,1,1000) xu=linspace(0.,1,1000)+0.5 Values=[] def Polynomial(t): return 3*t**3-2*t**2-5*t-1 def PolynomialFunction(x_left, x_right): for l, r in zip(x_left, x_right): t_samples = linspace(l, r, 1000) Values.append([Polynomial(t) for t in t_samples]) return Values result = PolynomialFunction(xl, xu)
方案3:numpy向量化计算(最高效)
利用numpy向量化操作替代循环,大幅提升计算效率,适合大数据量场景:
import numpy as np xl = np.linspace(0.,1,1000) xu = np.linspace(0.,1,1000)+0.5 # 生成所有区间的采样点,shape为(1000, 1000) t_samples = np.linspace(xl[:, np.newaxis], xu[:, np.newaxis], 1000) # 向量化计算多项式 def Polynomial(t): return 3*t**3 - 2*t**2 -5*t -1 # 转成嵌套列表输出 result = Polynomial(t_samples).tolist()
内容的提问来源于stack exchange,提问作者Bronze
相关产品推荐
相关产品推荐

