clear; // *** 入力パラメータ *** // おもりの数 n = 3; // おもりの重さ for i = 1:n do W(i) = input(strcat(["W",string(i)," = "])); end // 水平方向の距離 l = input("L = "); // 糸の長さ for i = 1:(n + 1) do L(i) = input(strcat(["L",string(i)," = "])); end // *** 解くべき連立方程式 *** function R = f(Z) R(1:n) = Z(n+2:2*n+1) .* cos(Z(1:n)) - Z(n+3:2*n+2) .* cos(Z(2:n+1)); R(n+1:2*n) = Z(n+2:2*n+1) .* sin(Z(1:n)) - Z(n+3:2*n+2) .* sin(Z(2:n+1)) - W(1:n); R(2*n+1) = sum(L .* cos(Z(1:(n+1)))) - l; R(2*n+2) = sum(L .* sin(Z(1:(n+1)))); endfunction // 初期値 Q0 = ones(2*n+2,1); Q0(n+1) = -1; // 非線形方程式ソルバ Q = fsolve(Q0,f); // *** おもりの位置の計算とプロット *** DX = L .* cos(Q(1:n+1)); DY= - L .* sin(Q(1:n+1)); X(1) = DX(1); Y(1) = DY(1); for i = 2:n do X(i) = X(i-1) + DX(i); Y(i) = Y(i-1) + DY(i); end // 縦横比を等しくする h = scf(); // ウィンドウを作成 ha = h.children(1); // Axes(座標軸)オブジェクトへのハンドルを取得 ha.isoview = "on"; // 座標軸の縦横比を等しくする ha.data_bounds = [0,-1 * ceil(max([abs(Y);l])); ceil(max([abs(Y);l])),0]; // 座標軸表示範囲の設定 // データのプロット plot([0;X;l],[0;Y;0]); plot(X,Y,'or','markersize',10); 180*(Q(1:n+1))/%pi