from pyfmi import load_fmu
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sko.PSO import PSO
# 目标函数
def demo_func(x):
x1, x2 = x
if not (x1 > x2 and x1 > 0.3 and x1 < 2.7 and x2 > 0.3 and x2 < 2.7):
return np.inf # 如果不满足条件,返回一个很大的值
model = load_fmu(r'C:\Users\win10\Desktop\GPS\test10.fmu')
model.set('hysteresis1.uHigh', x1)
model.set('hysteresis1.uLow', x2)
print('set_success')
print(model.get('hysteresis1.uHigh'))
print(model.get('hysteresis1.uLow'))
res = model.simulate(start_time=0, final_time=82800)
p_data = model.get('standardDeviation1.y')
# 确保返回的是一个数值而不是数组
print('max_deviation=',np.max(p_data))
return np.max(p_data)
# 粒子群算法
def particle_swarm_optimization(func, x0, num_particles=100, max_iterations=1000, inertia_weight=0.5, cognitive_weight=0.5, social_weight=0.5):
particles = np.array([x0 + np.random.randn(2) * 1 for _ in range(num_particles)])
velocities = np.zeros((num_particles, 2))
personal_best = particles.copy()
global_best = particles[0].copy()
for _ in range(max_iterations):
for i in range(num_particles):
# 更新速度
velocities[i] = inertia_weight * velocities[i] + cognitive_weight * np.random.rand() * (personal_best[i] - particles[i]) + social_weight * np.random.rand() * (global_best - particles[i])
# 更新位置
particles[i] += velocities[i]
# 评估新位置
fitness = func(particles[i])
if fitness < func(personal_best[i]):
personal_best[i] = particles[i]
if fitness < func(global_best):
global_best = particles[i]
return global_best
x0 = [2.0, 1.0] # 初始点
result = particle_swarm_optimization(demo_func, x0)
print('best_x is ', result, 'best_y is', demo_func(result))
使用粒子群算法对Modelica导出的FMU进行优化
最新推荐文章于 2024-09-06 10:38:06 发布
本文探讨了如何运用粒子群优化算法对通过Modelica导出的函数模型单元(FMU)进行参数优化。通过该算法,可以有效搜索FMU的最优配置,提高模型的性能和效率。
摘要由CSDN通过智能技术生成