メモ
不慮の事態に備えて,大切なデータはネットに残しておこう。ということでさっき見つけた関数をメモ。
function [func] = input_poly_2d(g0,h0,th0,ph0) hh1 = h0 * cos(th0); hh2 = h0 * sin(th0)^2; g1 = g0 * cos(ph0); g2 = g0 * sin(ph0); function [f,g,h] = func(s) x = s(1); y = s(2); z = s(3); hh = - (1-z^2) * hh1 + z * hh2; f = 0; g = -(x * g1 + y * g2) + hh / 4; % k / 2 :phi = +-pi / 2 の時のため h = hh * y + g / 100; % g / 20 :theta = 0,pi の時のため end func = @func; end
一次は有理式じゃないと無理かな,と思っていたんですが,最終的には多項式入力で安定化できてよかったです。
追記
紆余曲折してる。試行錯誤って大変だ。
function [func] = input_poly_2d(g0, h0, th0, ph0) z0 = cos(th0); h1 = 0.01 * cos(ph0); %h2 = cos(th0); %h3 = sin(th0)^2; g1 = g0 * cos(ph0); g2 = g0 * sin(ph0); function [f, g, h] = func(s) x = s(1); y = s(2); z = s(3); %hc = z - z0; %hs = - (1-z^2) * h2 + z * h3; %hh = h0 * (hc + hs); hh = h0 * (z - z0) * (z * z0 + 2); % hc: theta - theta_0 が大きいとき % hs: theta - theta_0 が小さいとき % hc はいらないかも gg = -(x * g1 + y * g2); f = 0; g = gg + hh / 10; % hh / 10 : phi = +-pi / 2 の時のため h = hh * (y + h1); % (y + h1): sin theta = 0 の時のため end func = @func; end
追記
最終的にはこんな感じになった
function [func] = input_poly_2d(g0, h0, th0, ph0) z0 = cos(th0); y0 = -sin(th0)*cos(ph0); %h2 = cos(th0); %h3 = sin(th0)^2; g1 = g0 * cos(ph0); g2 = g0 * sin(ph0); function [f, g, h] = func(s) x = s(1); y = s(2); z = s(3); f = 0; s = 1; if(y < 0) s = -1; end h = h0 * (z - z0) * (z * z0 + 2) * s; g = -(x * g1 + y * g2) + 0.001*g0*(y - y0); % 0.1h: sin(phi-phi0) = 0かつsin(phi) = 0の時 end func = @func; end