我是否可以集成但是将我的集成限制设置为循环? 那么,例如,将我的函数从8到8.9集成,直到它达到2.5的值? 谢谢!
f1 = lambda x,c : c/x
integrate1=quad(f, 8,8.97, args=c1)
print(integrate1)
也许?
for index in range(8,9):
f1 = lambda x,c: c/x
integrate1 = quad(f, index, index+0.1, args=c1)
print(integrate1)
答案 0 :(得分:1)
对于具有固定步长的非整数循环,您可以执行以下操作:
for val in xrange(80, 90):
val /= 10
........
或
val = 8.0
while val<8.9:
<do your worst>
val += step
在路上四舍五入可能是个好主意 - 获得所需的精确度
答案 1 :(得分:0)
嗯,显然你可以这样做:
import numpy as np
import scipy.integrate as si
def test_fn(x, c):
return c / x
def main():
lower_limit = 8.0
target_area = 2.5
c_val = 42.0
for upper_limit in np.arange(8., 10., 0.1):
area = si.quad(test_fn, lower_limit, upper_limit, args=(c_val,))
if area >= target_area:
print("Area is {} at ul={}".format(area, upper_limit))
break
if __name__=="__main__":
main()
但是你的步数间隔限制了你的结果准确性,你正在进行大量不必要的计算(==慢)。
正如@Jakob_Weisblat所说,你可以切换到二进制搜索算法。这更快,但你必须做一些额外的簿记。为什么不委派?
我建议将其转化为元问题:求解上限,以便将结果整合到您想要的目标值中:
import functools
import scipy.integrate as si
import scipy.optimize as so
def test_fn(x, c):
return c / x
def integrate_fn(ul, fn, ll, args, target):
return si.quad(fn, ll, ul, args=args) - target
def main():
lower_limit = 8.0
target_area = 2.5
c_val = 42.0
sol = so.brentq(
integrate_fn, lower_limit, 20.0, args=(
test_fn, lower_limit, (c_val,), target_area
)
)
print(sol)
if __name__=="__main__":
main()
(请注意,此代码未经测试,因为此计算机未安装scipy。)