计算范围内所有值的函数?

时间:2017-10-08 17:59:56

标签: python arrays loops math simulation

我正在尝试进行数学模拟以找出满足条件的时间。我的方法是定义条件并创建一个while循环来增加x和y的值。请参阅以下代码:

# Initialize the variables.

x1list = []
y1list = []
x2list = []
y2list = []

x = 0
y = 0
i = 0

while i < 10:

  # Update data.
  i += 1
  x += .1
  y += .1

  func1 = x + y - 1
  func2 = x * y

  cond1 = func1 < func2 < 1

  if cond1:
    x1list.append(x)
    y1list.append(y)

此代码的问题在于它仅计算x和y以相同速率增加时的条件。当然,我可以改变费率,但这并不能真正解决问题。

我想要做的是计算范围内的条件,比如x(-10,10)和y(-10,10)。我正在考虑制作一个包含所有x值的数组和另一个包含所有y值的数组,但是,我不知道如何用所有这些值计算条件。

我的另一个想法是获取单个x值并使用所有y值进行测试,然后再次增加x并进行测试。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

对于这类问题,你不想盲目地进行迭代。

首先,您可以寻找明显的解决方案:x = 0y = 0是一个。

您可以使用sympy尝试查找常规解决方案。 Wolfram Alpha也是完成这些任务的绝佳工具,并找到了这个区域:

enter image description here

如果这些工具找不到任何代数解决方案,您可以使用scipy.optimize查找一些数值结果:

from scipy.optimize import minimize
def f(x):
    return (x[0] + x[1] - 1)**2 + (x[0] *  x[1])**2

minimize(f, [0,0])

输出:

   status: 0
  success: True
     njev: 6
     nfev: 24
 hess_inv: array([[ 0.59518944, -0.40481056],
       [-0.40481056,  0.59518944]])
      fun: 0.050945906253583216
        x: array([ 0.4533971,  0.4533971])
  message: 'Optimization terminated successfully.'
      jac: array([ -2.88896263e-06,  -2.88896263e-06])

对于这个例子来说,这有点过分,但它对于更复杂的功能显示出有希望的结果。

答案 1 :(得分:1)

方法1:2D'模拟'网格

  

我正在考虑制作一个包含所有x值的数组和另一个包含所有y值的数组,但是,我不知道如何用所有这些值计算条件。

import numpy as np

x = np.arange(-10, 10, 0.1)
y = np.arange(-10, 10, 0.1)

# Create 2D simulation meshes for x and y.
# You can read the API entry for meshgrid to learn about options for index 
# ordering, mesh sparsity, and memory copying
X, Y = np.meshgrid(x, y)

func1 = X + Y - 1
func2 = X * Y
cond = np.logical_and(func1 < func2, func2 < 1.0) # intrinsic `and` does not work here

# now cond can be used as a 'mask' for any masked-array operations on X and Y
# including for numpy boolean indexing:
print('(X, Y) pairs')
for xy_pair in zip(X[cond], Y[cond]):
    print xy_pair

方法2:嵌套循环

  

我的另一个想法是获取单个x值并使用所有y值进行测试,然后再次增加x并进行测试。

import numpy as np  # no slower or memory-intensive than `from numpy import arange`

X = []
Y = []
for y in np.arange(-10, 10, 0.1):
    for x in np.arange(-10, 10, 0.1):
        if (x+y-1 < x*y) and (x*y < 1.0):
            X.append(x)
            Y.append(y)

print('(X, Y) pairs')
for xy_pair in zip(X, Y):
    print xy_pair

选择哪种方法?

  

我该如何解决这个问题?

这完全取决于您想要对评估为(x, y)的{​​{1}}对做什么。如果您使用更多指导来编辑问题,那么对于您的用例来说,这可能是更直接的解决方案。

例如,方法1 提供用于绘制解空间的2D数组,而方法2 提供用于数据库的紧凑python True

警告:条件运算符

还必须指出,具有多个条件运算符的数学表达式在Python中没有意义。这一行:

  

list

如果使用标准操作顺序进行评估,则cond1 = func1 < func2 < 1会对cond1 = (func1 < func2) < 1进行中间评估,这会将cond1 = (True/False) < 1隐含地重新设置为True1 as False,但无法正确评估数学表达式0

修改

@(Eric Duminil)的答案提供了解决潜在数学问题的替代概念,上述两种方法假设您的问题需要在离散网格上以数字方式求解,并且具有这些离散解决方案点的任何代码都是必需的接着

@ Uriel的答案似乎有效,但请参阅我对条件运算符的说明,说明为什么这可能会产生误导。

另外,我最初输入func1 < func2 < 1来组合2D条件语句,但这不正确并导致错误。请改用and