python求非线性优化问题_python求非线性优化问题_用python优化非线性函数

本文介绍了如何在Python中使用scipy.optimize模块解决非线性优化问题。作者面临一个涉及多个变量和约束条件的目标函数,通过不断调整和尝试,最终找到了能够正确运行的优化函数实现,但遇到了输出值不理想的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我在python中有一个函数,如下所示:import numpy as np

def fun(Gp,Ra,Mr,Pot,Sp,Mc,Keep):

if(Keep==True):

return(Pot*np.tanh((Gp+Ra+Mr+ Mc)*Sp ))

假设以下数据:

^{2}$

我总共有100个GP,我想适当地分配它们

为了最大化objective_function:

在全部约束下,3个元素正

根据this的帖子,scipy.optimize将是一个好办法,但我很困惑如何把问题写下来

更新:我的尝试from scipy.optimize import minimize

y = {'A': {'RA': 0.5, 'MR': 0.97, 'POT': 0.25, 'SP': 0.25, 'MC': MC_1, 'keep': True},

'B': {'RA': 0.8, 'MR': 0.95, 'POT': 0.12, 'SP': 0.12, 'MC': MC_2, 'keep': True},

'C': {'RA': 0.9, 'MR': 0.99, 'POT': 0.05, 'SP': 0.15, 'MC': MC_3, 'keep': True}}

def objective_function(x):

return(

-(fun(x[0], Ra=y['A']['RA'], Mr=y['A']['MR'],

Pot=y['A']['POT'], Sp=y['A']['SP'],

Mc=y['A']['MC'], Keep=y['A']['keep']) +

fun(x[1], Ra=y['B']['RA'], Mr=y['B']['MR'],

Pot=y['B']['POT'], Sp=y['B']['SP'],

Mc=y['B']['MC'], Keep=y['B']['keep']) +

fun(x[2], Ra=y['C']['RA'], Mr=y['C']['MR'],

Pot=y['C']['POT'], Sp=y['C']['SP'],

Mc=y['C']['MC'], Keep=y['C']['keep']))

)

cons = ({'type': 'ineq', 'fun': lambda x: x[0] + x[1] + x[2] - 100})

bnds = ((0, None), (0, None), (0, None))

minimize(objective_function, x0=[1,1,1], args=y, method='SLSQP', bounds=bnds,

constraints=cons)

现在的问题是我得到错误ValueError: Objective function must return a scalar,而fun函数的输出是标量

更新2(在@Cleb comment之后)

现在我改变了函数:def objective_function(x,y):

temp = -(fun(x[0], Ra=y['A']['RA'], Mr=y['A']['MR'],

Pot=y['A']['POT'], Sp=y['A']['SP'],

Mc=y['A']['MC'], Keep=y['A']['keep']) +

fun(x[1], Ra=y['B']['RA'], Mr=y['B']['MR'],

Pot=y['B']['POT'], Sp=y['B']['SP'],

Mc=y['B']['MC'], Keep=y['B']['keep']) +

fun(x[2], Ra=y['C']['RA'], Mr=y['C']['MR'],

Pot=y['C']['POT'], Sp=y['C']['SP'],

Mc=y['C']['MC'], Keep=y['C']['keep']))

print("GP for the 1st: " + str(x[0]))

print("GP for the 2nd: " + str(x[1]))

print("GP for the 3rd: " + str(x[2]))

return(temp)

cons = ({'type': 'ineq', 'fun': lambda x: x[0] + x[1] + x[2] - 100})

bnds = ((0, None), (0, None), (0, None))

现在有两个问题:

1x[0],x[1],x[2]的值非常接近x[0],x[1],x[2]的和超过100

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值