• ベストアンサー

C++言語で、レナードジョーンズ関数型のポテンシャル法をプログラム

わたしはODE(Open Dynamics Engine)について勉強しているのですが、障害物回避の方法で、レナードジョーンズ関数を利用したポテンシャル法をC++でプログラムしたいのですがどのようなプログラムを作ればいいのかわかりません。引力と斥力の合成ベクトルを求めるプログラムを教えていただきたいので、よろしくお願いします

質問者が選んだベストアンサー

  • ベストアンサー
noname#57148
noname#57148
回答No.3

 なるほど、面白そうな応用ですね。3対の操作を自動化するための手法の一つにレナード-ジョーンズ・ポテンシャルの考えを入れる。確かに、一定間隔の距離関係は保てそうと思います。ただ、ボールに対しても同じ考えでうまくいくでしょうか?ボールの移動速度と操作マシンの加速性(反応速度)も重要となりそうですね。  まず、どの程度の精度・速度でお互い+ボールの位置関係を把握出来るかが重要なポイントと思います。把握出来るものとして、自機を原点とした場合の相互の位置関係(距離・方向)を検出し、引力・斥力をスカラー量で計算します。ディフェンス機(以降:子機)の正面をy軸座標と固定した場合の、座標(x,y)に変換し、このデータを成分ごとに合成し、最後に(移動方向・マシンの加速度)のデータに換算し移動する。この機能を各子機に実装すればよいかと思います。簡単にはこんな感じでしょうか?  ボールに対して遠い位置にいるマシンが他機の斥力に邪魔され反応が鈍る事もありそうに思いませんか?恐らく、A・B・n・mのパラメータのチューニングが鍵になりそうですね。また、マシンの反応速度と1サイクルの計算速度のバランスも重要になりそうだと思います。 以上、おおまかなアドバイスですが参考になりましたでしょうか?仕様の取り違い等があれば、また追記お願いします。

s721942
質問者

お礼

回答ほんとうにありがとうございます!! 私は今友達と一緒に考えていて、スカラで全て計算した後にベクトル計算すればいいのではないかというアイデアを、さっきまさにIMTさんから回答をいただく直前に思いつき、そしてIMTさんの回答のおかげで確信にかわりました。また、スカラを逆数で計算することで遠くのものからの力は弱く近いものからの力は強いようにできると考えたのですがどうでしょうか??

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

noname#57148
noname#57148
回答No.4

 遠くからの力は弱い方が都合が良いものなのでしょうか?レナードの式を計算する上で引力(加速度)は距離の逆数となっていますがその事ですか?求まる引力の値をマシンの加速度に直す換算にもよるかと思いますが、単純に、マシン間での衝突回避の為の手法であれば、これで大丈夫だと思います。ただ、ボールに対して遠い位置にいるマシンは反応が鈍くなる様に思いますが、それで良いのでしょうか・・・。  とりあえず、目算が立てられたのであれば、試作し検証を行いつつ改善を行っていくと良いと思いますよ。パラメータの設定によっては、マシンの動作も大幅に変化すると思いますし。イメージ通りの動きでなければ、加速度の算出式に一工夫加える事(算出式の変更・追加)も出来て、拡張性もある良い方法かと思います。拡張例としては、マシンごとにフィールドでのデフォルトの重力場を個別に設定したとして、それも加速度計算に利用できればフォーメーションを組んだりも出来そうに思います。がんばってみてください。  また、なにかあれば追記お願いします。

s721942
質問者

お礼

回答ありがとうございます。 IMTさんのアドバイスのおかげもあり、 ついにそれらしきものができあがりました。 やはり、目標物が遠くへ行けば行くほど子機のスピードを速めたほうがよいと思ったので、目標物と子機間の距離rを速度の変数として使うことで実現しました。 斥力と引力のベクトルの微調整は本当に小さな違いでも実行に大きな差いがでるのですね。 プログラムを見られたら不備な点はまだまだ多いでしょうが、 思い描いていたものが実行されて満足しています。 どうもありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • thamansa
  • ベストアンサー率40% (95/232)
回答No.2

レナードジョーンズ関数については何も知らないのですが、 > どのようなプログラムを作ればいいのかわかりません とのことですのでアドバイスをひとつ。 > 1.引力と斥力の合成ベクトルを求める のところまではわかっているようですので、次のステップで進めてください。 ・まずは合成ベクトルを求めるアルゴリズムを整理して、手計算できるレベルまで明確にする。 ・アルゴリズムがわかれば後は実装するだけ。 基本的に、自分が手で計算できないアルゴリズムは、プログラムで実装することができません。

s721942
質問者

お礼

夜晩くにどうもありがとうございます。 なるほど。手計算できるところまでかみくだければ プログラムできますよね。 積分で言うなら「台形の面積をだしてそれをt=0からt=t'まで 足していく」のような感じですよね?? しかしこの場合、合成ベクトルは、どのように表せばいいのか考えましたが、アイデアが浮かびませんでした。 もしよいアイデアがあればお願いします。 わたしたちが与えられている関数は U(r)=-A/r^n+B/r^mで これ(ポテンシャルエネルギー)を微分すると ロボが受ける力F(r)=-nA/r^(n+1)+mB/r^(m+1)と なりますがnA,mB,n+1,m+1をそれぞれA',B',n',m'とおくと U(r)と同じ式になるからプログラムではU(r)を使ってください。 ということでした。 また、ロボにはセンサが実装されていて彼らは、目標物に向かって進んでいくことができます。このとき、センサが目標物を感知(ロボの視野に入ったら)したらその方向へ引力、他のロボを感知したらその方向から斥力を受けるようにしたいのです。

全文を見る
すると、全ての回答が全文表示されます。
noname#57148
noname#57148
回答No.1

レナード-ジョーンズ・ポテンシャルとは、ウィキペディアにのっている内容のものでよいですか?具体的に、どの様な入力を与え、どの様な結果を得たいのかの仕様がはっきりしないと、アドバイスし辛いので追記よろしくお願いします。

s721942
質問者

お礼

情報が少なくて申し訳ありませんでした。 レナード-ジョーンズ・ポテンシャルで与えられている式は 位置rにいる物体のポテンシャルエネルギーU(r)=-A/r^n+B/r^m で右辺の一項目が引力、二項目が斥力を表しています。 私が作りたいプログラムは、 差動駆動型ロボットを4体用いて、1体はフォワードで、フォワードは、コマンドで手動で動かし、3体はディフェンスをして、その3体はポテンシャル法(斥力)で一定の距離を保ちつつ、フォワードのボールを取りに行く(引力)ようなプログラムを作りたいのですが、 ロボット、ボール、グランドなどはもうプログラムできていて、 あとはそのポテンシャル法の関数が書ければということで質問させていただきました。 また、手持ちの資料で与えられているアルゴリズムは while(1){ 1.引力と斥力の合成ベクトルを求める    2.その方向へ進む  } です。 どうでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ODE (Open Dynamics Engine)を使ったプログラムで

    ODE (Open Dynamics Engine)を使ったプログラムで人型のモデルを作ってみたいのですが、簡単な人型モデルのサンプルのプログラムを作っていただけないでしょうか。もしできる方がいらっしゃいましたらお願いします。

  • ポテンシャル関数の微分

    レナードジョーンズポテンシャル(添付画像の(1)式)をつかってMD計算をしているものです プログラムの昨日を拡張しようとおもい、論文を探したところ良い感じのものが見つかったのですが、添付画像の(2)の計算をしなければいけないようです。 ポテンシャル関数の変数はスカラーのrで、(2)の方ではベクトルの関数になっています どうにかして(1)に適応させたいのですが、どうすればいいのかわかりません・・・ 出だしから躓いているのですが、わかるかたお願いします

  • ファンデルワールス レナード・ジョーンズポテンシャルの導き方

     ●レナード・ジョーンズポテンシャルの導き方について詳しく  知りたいのですが、詳しい説明が載ったサイトとか  本などないでしょうか?   ・レナード・ジョーンズポテンシャルは、実験値と   ほぼ合ってますが、若干のずれがありますよね。   分極や零点振動とかのことをいろいろ考えての   ことと思いますが、どういったモデルでの理論値なのか   詳しく知りたいのですが。   実験値とのずれについての、説明なども知りたいのですが。

  • レナード・ジョーンズについて

    レナード・ジョーンズポテンシャルは同一分子間のモデルで議論していますが,異分子間でも適用できるのでしょうか? ネットでチラッとできるということを書いてあったのですが,その場合は,パラメータ値ε,σをどのように取ればいいのでしょうか? 分かる方がいらっしゃったらよろしくお願いします.

  • レナード・ジョーンズの式

    分子間相互作用のポテンシャルエネルギーの式として使われるレナード・ジョーンズの式で、エネルギーが最小になる分子間距離を表す式の導き方がわかりません。どうやて導けば良いのか教えてください。  最小になる分子間距離の式は以下であっていると思いますが…。     r=2^(1/6)σ よろしくお願いします。

  • 関数はあるがC言語で書けないプログラム

    数学的に関数はあるがC言語では書けないプログラムを 探しています。 関数自体は偶数か奇数(0以上の整数)を返す関数で しかしプログラムでは書けないというものです。 よろしくお願いします。

  • [動的配列]C言語の勉強で簡単な単語帳プログラム

    C言語の勉強として以下のような簡単なプログラムを作りました。 テキストファイルからユーザが入力した単語を検索し、ヒットしたものだけ その単語とその説明を表示するというプログラムです。 正常に動いているようなので、 つぎはループごとに、読み込んだ文字数に合わせて 配列(mean)の要素数を動的に確保するということを しようと思うのですがどのタイミングでmallocやreallocを入れればよいのか いまいちよくわかりません。 また、このプログラムの欠点などありましたら教えていただけると助かります。 よろしくお願いします。 --------------------------------------------------------------------- //マイ単語帳プログラム #include<stdio.h> #include<stdlib.h> #include<string.h> main(){ char input[100]; //ユーザが入力した文字列を格納 char tango[200]; //ファイルの単語 char mean[1000]; //ファイルの説明 char conti; //検索を続けるかどうかの入力 int flag; //検索単語がヒットした場合に立てるフラグ FILE *fp; //単語ファイルのopen if((fp=fopen("tango.txt","r"))==NULL){ printf("ファイルが開けません。"); exit(1); } /*******************ファイルからの文字列読み込み****************************/ //Yが入力されるまで検索を続ける do{ printf("検索する単語を入力してください。\n"); scanf("%s",input); printf("検索対象:%s\n\n",input); flag=0; //ヒットしたかどうかのフラグの初期化 while((fscanf(fp," %s %s",tango,mean))!=EOF){ //fscan 書式を指定して読み込める。 if(strcmp(tango,input)==0){ //strcmpは2つの引数が同じ時0を返す printf("%s\n%s\n\n\n",tango,mean); flag=1; //ファイル内に単語があった場合にフラグを立てる。 } } rewind(fp); if(flag==0){ printf("その単語は登録されていません。\n"); } printf("検索を終了しますか? ==> Y\n"); printf("検索を続けるにはY以外の文字を入力してください。\n"); scanf(" %c",&conti); //scanfの問題点を回避するために読み込み前に半角スペース } while(conti!='Y'); /**************************************************************************/ fclose(fp); return; } ---------------------------------------------------------------- tango.txt apple リンゴ SMTP 電子メールの送信や転送を行うためのプロトコル。 rewind 形式:rewind(ファイルポインタ); C言語のファイルシステム関数。ファイルの現在位置をファイルの先頭に置くことができる。

  • 共役勾配法を用いた最適化について

    弾性体の変形を見るために,停留ポテンシャル法を用いようとしているのですが,その際に目的関数にひずみエネルギーをとり 独立な24変数の関数の極小値を共役勾配法で求めようとしています. Hesse行列を手計算でだし,最適化を行うプログラムを書いたのですが どうも上手くいきません. 下にプログラムの一部分をのせます. 共役勾配法について勘違いしている可能性もあるので 問題点を教えて頂ければ幸いです. x_vectorは24変数ベクトルで,dは探索方向,HはHesse行列です. for(i=0;i<10;i++) { lambda = (x_vector*d)/(d*H*d); x_save_vector = x_vector; x_vector=x_vector - lambda*H*d;//変数べクトル再設定 if(i==0) { // 初期値 gamma = 1; } else { gamma =x_vector*x_vector/(x_save_vector*x_save_vector); } d = x_vector + gamma*d;//探索方向再設定 }

  • レナードジョーンズ 二酸化炭素

    化学のポテンシャルエネルギーの二酸化炭素のσは,何の文献で調べればでるでしょうか?

  • 分かる限りで構わないのでお願いします。

    分かる限りで構わないのでお願いします。 1次元のδ関数型の引力ポテンシャル V(x)=-cδ(x) (cは正の定数) の中を運動する質量mの粒子に関するシュレーティンガー方程式を考える。 (1)を参考に(2)、(3)、(4)を答えて下さい。 (1) x=0における解の接続条件を求めよ。 解 V(x)=-cδ(x) (c>0) (-h^2/2m)・(d^2Ψ(x)/dx^2)-cδ(x)Ψ(x)=EΨ(x) これを両編(-ε,ε)で積分 → (-h^2/2m)・{(dΨ(+ε)/dx)- (dΨ(-ε)/dx)-cΨ(0)=E∫(-ε→ε)Ψ(x)dx ε(右下矢印)0の極限をとると (-h^2/2m)・{(dΨ(+0)/dx)- (dΨ(-0)/dx)-cΨ(0)=0 よって、(dΨ(+0)/dx)- (dΨ(-0)/dx)=(-2mcΨ(0)/h^2) さらにこれをもう1度(-ε,ε)で積分して、ε(右下矢印)0の極限をとると Ψ(+0)-Ψ(-0)=0 (2)E>0の粒子が左から入射する際の、ポテンシャルV(x)による粒子の反射率と透過率計算して下さい。 (3)束縛状態(E<0)のエネルギー準位を求めて下さい。 (4)δ型関数の斥力ポテンシャル(c<0)の場合に束縛状態が存在するかどうか考察して下さい。