在积分
中
我想优化函数Dt
,因为我知道积分的最终结果。我在k1
和k0
方面有k2
和N
的表达式,我希望优化k2
和N
。它们有约束,需要介于某些值之间。我在代码中设置了所有这些,但我不知道如何告诉遗传算法优化积分函数?我有什么东西在这里失踪吗?积分通常用数字进行评估,但我试图倒退,假设我知道答案找到输入参数
修改
好的,所以这是我的代码。我知道积分必须加起来一个已知的值,我知道这个值,所以我需要用给定的参数优化变量。我创建了一个目标函数y = integral - DT。我将theta保持为syms,因为它是集成给DT
的东西。
function y = objective(k)
% Define constants
AU = astroConstants(2);
mu = astroConstants(4);
% Define start and finish parameters for the exponential sinusoid.
r1 = AU; % Initial radius
psi = pi/2; % Final polar angle of Mars/finish transfer
phi = pi/2;
r2 = 1.5*AU;
global k1
k1 = sqrt( ( (log(r1/r2) + sin(k(1)*(psi + 2*pi*k(2)))*tan(0)/k(1)) / (1-
cos(k(1)*(psi+2*pi*k(2)))) )^2 + tan(0)^2/k(1)^2 );
k0 = r1/exp(k1*sin(phi));
syms theta
R = k0*exp(k1*sin(k(1)*theta + phi));
syms theta
theta_dot = sqrt((mu/(R^3))*1/((tan(0))^2 + k1*(k(1))^2*sin(k(1)*theta +
phi) + 1));
z = 1/theta_dot;
y = int(z, theta, 0,(psi+2*pi*k(2))) - 1.3069e08;
global x
x=y;
end
我的k被约束,以下是约束函数。我希望我在这里所做的就是告诉它函数MUST = 0。
function [c,c_eq] = myconstraints(k)
global k1 x
c = [norm(k1*(k(1)^2))-1 -norm(k1*(k(1)^2))];
c_eq =[x];
end
最后,我的ga代码看起来像这样。老实说,我整夜都在玩它并在收到错误消息后收到错误消息 - 范围来自"约束函数必须返回实际值"到fcnvectorizer"错误#34;并且"无法将表达式转换为双数组",最后两个在我删除约束后出现。
clc; clear;
ObjFcn = @objective;
nvars = 2
LB = [0 2];
UB = [1 7];
ConsFcn = @myconstraints;
[k,fval] = ga(ObjFcn,nvars,[],[],[],[],LB,UB,ConsFcn);
我已经被困在这个问题上好几个星期了,即使在搜索文献时也无处可去。