[運算] 優化函數
global K L thetamax alpha
K=1226
L=2600
thetamax=30 %輸入外轉向最大轉角(單位度)
x0(1)=200 %輸入初始點第一個分量(臂長mm)
x0(2)=70 %輸入初始點第二個分量(底角、度)
thetamax=thetamax*pi/180 %轉換為弧度單位
x0(2)=x0(2)*pi/180;
lb(1)=0.1*K;
lb(2)=acot(K/(1.2*L));
ub(1)=0.17*K;
ub(2)=pi/2;
alpha=linspace(0,thetamax,61)+pi/180;%將轉角劃分為60等分區隔
options=optimset('TolFun',1e-10,'TolCon',1e-6);
[y,resnorm]=lsqnonlin('fun',x0,lb,ub,options); %調用lsqnonlin函數求解
for i=1:61
betae(i)=acot(cot(alpha(i))-K/L); %計算轉角期望值
A(i)=2*x0(1).^2*sin(x0(2)+ alpha(i)); %計算實際轉角
B(i)=2*K*x0(1)-2*x0(1).^2*cos(x0(2)+alpha(i));
C(i)=2*x0(1).^2-4*x0(1).^2*(cos(x0(2))).^2+4*K*x0(1)*cos(x0(2))-2*K*x0(1)*cos(x0(2)+alpha(i));
theta3(i)=2*acot((A(i)+sqrt(A(i).^2+B(i).^2-C(i).^2))/(B(i)+C(i)));
beta(i)=x0(2)+theta3(i)-pi;
end
plot(alpha,betae,'r');hold on %繪製轉角期望值曲線
plot(alpha,beta,'b') %在同張圖上畫實際轉角曲線
hold off
副程式
function f=fun(x)
global K L thetamax alpha
f=0; %函數值初始化
for i=1:61
betae(i)=acot(cot(alpha(i))-K/L); %計算轉角期望值
A(i)=2*x(1).^2*sin(x(2)+ alpha(i)); %計算實際轉角
B(i)=2*K*x(1)-2*x(1).^2*cos(x(2)+alpha(i));
C(i)=2*x(1).^2-4*x(1).^2*(cos(x(2))).^2+4*K*x(1)*cos(x(2))-2*K*x(1)*cos(x(2)+alpha(i));
theta3(i)=2*acot((A(i)+sqrt(A(i).^2+B(i).^2-C(i).^2))/(B(i)+C(i)));
beta(i)=x(2)+theta3(i)-pi;
if alpha(i)<=pi/18 %計算目標函數值
f(i)=1.5*abs(beta(i)-betae(i));
elseif alpha(i)<=pi/9
f(i)=abs(beta(i)-betae(i));
else
f(i)=0.5*abs(beta(i)-betae(i));
end
end
下面是我的邊界
0.1K<x1<0.17k
cot^-1(K/1.2L)<=x2<=90度
我的疑問是因為我要優化的是x1的臂長的長度,
但是跑出來的結果臂長都沒有改變,想請問一下是哪邊出了問題呢?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.127.33.235