集成在if语句中?(python)
我是否可以进行集成,但在循环中设置集成限制? 例如,将我的函数从8积分到8.9,直到它达到2.5? 谢谢大家!集成在if语句中?(python),python,integrate,Python,Integrate,我是否可以进行集成,但在循环中设置集成限制? 例如,将我的函数从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(i
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)
对于具有固定步长的非整数循环,可以执行以下操作:
for val in xrange(80, 90):
val /= 10
........
或
val=8.0
虽然val嗯,显然你可以做到:
但是步长间隔限制了结果的准确性,而且您正在进行大量不必要的计算(=缓慢)
正如@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。)在较低的代码块中有几个语法错误,在for…
之后应该有一个:
,循环的以下内部部分应该缩进。另外,你的名字f
和f1
应该是一样的。我对你在这里提出的问题有点困惑,你说的“将我的函数从8积分到8.9,直到它达到2.5”是什么意思?我有一个分布c/x,基本上我需要找到第95个百分位(该分布的置信区间)。我迭代的低端是8,高端是20。所以,我需要从,比方说,到8.5积分,得到2.5的置信区间。我试图以某种方式循环积分,这样当它发现和为2.5时,它就会停止。希望这更清楚一点!也许我也可以做一个求和,比如c/x=cln(x)的积分。我将尝试这样做,以及看看会发生什么。。。比如,对于范围内的索引(小步):res=res cln(index),如果res感谢您!我试试看!
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()
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()