--.--
--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

07.30
Mon
最速降下曲線をGAで解いてみようと思うんですけど、

それに必要になるだろう物体が曲線上を転がるのにかかる時間を求める方法を書きます。

てかGAって近似解を求めるのに使うのになんでわざわざ厳密解が求まるだろう最速降下問題に使うんでしょうか

まぁGAの手法を知る題材としてということで....まだコードは書いてないですが...

さて考え方としては、曲線を微小区間で考えた直角三角形の斜辺で表し、それを足し算する的なかんじです。

三角形の斜辺は普通に三平方の定理で出せますね。

で、そいつを速度で割ってやります。それでそいつを積分してやれば、全体でかかった時間がでるはずです



graph5.png

斜辺が、

leng.png

変形して

defor.png



ある位置xでの速度は、運動エネルギーと位置エネルギーの等式から

energyeq.png



高さhはf(x)に置き換わるのでいろいろ変形して

vly.png

割って積分して、

time.png



となります。



ためしに、これを使って"斜面上"を転がるのに掛かる時間を求めてみます。

以下のような感じです.

examp4.png

但しsqrtはルートを表します.



あとは上記の積分の式に入れて計算すればいいんですが、

計算が結構面倒になるので、

inte.png

プログラムにやらせます。←

積分の計算は区分求積法をつかいました

なんか精度わるいし時間かかるしで最悪ですが....



#!usr/bin/env python
#coding:utf-8

import math

def calcIntegral(function , start , end , width = 0.0000001):
	divider = (end - start) / width
	baselen = (end - start) / divider
	result = 0
	for each in xrange(int(divider)):result +=  function(start +  each * baselen )
	return result * baselen
	

def func(x):
    return (-x * math.sqrt(3.0)/3.0) + 1.0/2.0


def wrapper(x):
    up = math.sqrt(1.0 + math.pow( -math.sqrt(3.0)/3.0 , 2.0))
    dow = math.sqrt(2.0 * 9.8 * func(x))
    return up/dow
    
	
def main():
    print calcIntegral(wrapper , 0.0 , math.sqrt(3.0)/2.0)





	
	
if __name__== "__main__" : main()



0.638くらいになってほしいんだけどねー....
スポンサーサイト

comment 0 trackback 0
トラックバックURL
http://telracsmoratori.blog.fc2.com/tb.php/122-5b188a1f
トラックバック
コメント
管理者にだけ表示を許可する
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。