我正在用Python为下面的方程寻找一个解。
345-0.25*t = 37.5 * x_a
'with'
t = max(0, 10-x_a)*(20-10) + max(0,25-5*x_a)*(3-4) + max(0,4-0.25*x_a)*(30-12.5)
'x_a = ??'如果这个问题有一个以上的解决方案(我甚至不确定,从数学的角度看是否会发生这种情况?),我希望我的代码返回一个正数(!)值对于x_a,这使t最小化。
根据我以前在Python、Pandas和NumPy的基础知识,我实际上不知道如何解决这个问题。谁能给我个提示吗?
为了澄清这一点:我在方程中插入了一些示例性的数字,以使问题更容易解决。当然,在我的最后代码中,对于不同的场景,可能会有不同的数字。但是,在每个场景中,x_a是唯一未知的变量。
更新
我再次考虑了这个问题,并提出了以下解决方案,其结果与MichałMazur所做的计算结果相同:
import itertools
from sympy import Eq, Symbol, solve
import numpy as np
x_a = Symbol('x_a')
possible_elements = np.array([10-x_a, 25-5*x_a, 4-0.25*x_a])
assumptions = np.array(list(itertools.product([True, False], repeat=3)))
for assumption in assumptions:
x_a = Symbol('x_a')
elements = assumption.astype(int) * possible_elements
t = elements[0]*(20-10) + elements[1]*(3-4) + elements[2]*(30-12.5)
eqn = Eq(300-0.25*t, 40*x_a)
solution = solve(eqn)
if len(solution)>2:
print('Warning! the code may suppress possible solutions')
if len(solution)==1:
solution = solution[0]
if (((float(possible_elements[0].subs(x_a,solution))) > 0) == assumption[0]) &\
(((float(possible_elements[1].subs(x_a,solution))) > 0) == assumption[1]) &\
(((float(possible_elements[2].subs(x_a,solution)))> 0) == assumption[2]):
print('solution:', solution)与已经建议的方法相比,这可能有一点优势,因为它不依赖于测试所有可能的值,因此可以用于非常小的和非常大的解决方案,而无需花费大量时间(?)。但是,只有当t没有更复杂的函数时,它才可能有用(即使有5max(.)语句,因此(2^5=)需要测试的32种场景看起来相当麻烦)。
就我而言,我只是意识到我的问题比我想的还要复杂。对于我的项目,推导出"t“值所需的计算是相当纠缠的,不能只写在一个方程中。然而,它仍然是一个函数,它只依赖于x_a。所以我仍然希望有一个类似于在Excel中建议的解决方案.否则,我将坚持简单地测试所有可能的数字的方法。
发布于 2022-02-11 13:23:35
如果您对一个与Python有一点不同的解决方案感兴趣,那么我将帮助您。打开Excel,使用Solver扩展并插入您感兴趣的数据,如下所示:

在E2中插入我刚刚写的命令,插入到E4中
=300-0,25*E2插入到F4中:
=40*F2然后打开“解决程序”菜单。

在集合目标中放置变量t,希望将其最小化。将a放入约束菜单中,将E4和F4单元格相等。您可以检查“让非共星变量成为非负变量”,这将防止变量降到0以下。你的计算方法是严格非线性的,所以你把这个选项留在那里。
你点击解题。计算值显示在屏幕上。
我可以想到python方法:
minimumval=10100
minxa=10000
eps=0.01
for i in range(100000):
k=i/10000
x_a=k
t = max(0, 10-x_a)*(20-10) + max(0,25-5*x_a)*(3-4) + max(0,4-0.25*x_a)*(30-12.5)
val=abs(300-0.25*t-40*x_a)
if (val<eps):
if t<minimumval:
minimumval=t
minxa=x_a它不是直接的解决方案,因为它只控制您通过eps值在等式中产生的错误。然而,它给出了解决办法。
https://stackoverflow.com/questions/71080288
复制相似问题