首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python中求解一个方程(使用max语句)

在python中求解一个方程(使用max语句)
EN

Stack Overflow用户
提问于 2022-02-11 12:43:23
回答 1查看 144关注 0票数 0

我正在用Python为下面的方程寻找一个解。

代码语言:javascript
复制
    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所做的计算结果相同:

代码语言:javascript
复制
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中建议的解决方案.否则,我将坚持简单地测试所有可能的数字的方法。

EN

回答 1

Stack Overflow用户

发布于 2022-02-11 13:23:35

如果您对一个与Python有一点不同的解决方案感兴趣,那么我将帮助您。打开Excel,使用Solver扩展并插入您感兴趣的数据,如下所示:

在E2中插入我刚刚写的命令,插入到E4中

代码语言:javascript
复制
=300-0,25*E2

插入到F4中:

代码语言:javascript
复制
=40*F2

然后打开“解决程序”菜单。

在集合目标中放置变量t,希望将其最小化。将a放入约束菜单中,将E4和F4单元格相等。您可以检查“让非共星变量成为非负变量”,这将防止变量降到0以下。你的计算方法是严格非线性的,所以你把这个选项留在那里。

你点击解题。计算值显示在屏幕上。

我可以想到python方法:

代码语言:javascript
复制
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值在等式中产生的错误。然而,它给出了解决办法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71080288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档