忍者ブログ
ロボット製作のblog  日々の生活も書くかも・・・
カレンダー
05 2017/06 07
S M T W T F S
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30
最新CM
[05/01 nyamo]
[12/14 アいス]
[11/06 あおのり]
[11/05 IKETOMU]
[11/05 超二足]
最新TB
カウンター
プロフィール
HN:
あおのり
性別:
非公開
バーコード
ブログ内検索
フリーエリア
アクセス解析
[PR]
2017/06/28(Wed) 21:04:42
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

動画を取り込んだので、予選での失態を公開




以前ルンゲ・クッタ法での微分方程式を数値解析的に解く方法を試みましたが、計算にかかる時間により一時断念していました。
今回、固定小数点での計算になるよう手直ししてみました。
コレでH8でも制御周期内で次の重心位置の座標を求められるかな?
問題は精度だけどね。

こんな感じのコードです。
1000倍してるだけなんですけどね。

#include <stdio.h>
#include <math.h>

void drunge(long *x, long *y, long *z, long h , long (*f)(long, long, long),long (*g)(long,long,long))
{
 long k1,k2,k3,k4,l1,l2,l3,l4;
 k1 = f(*x, *y, *z);
 l1 = g(*x, *y, *z);
 k2 = f(*x + (h / 2), *y + h * k1 / 2/1000, *z + h * l1 /2/1000);
 l2 = g(*x + h / 2, *y + h * k1 / 2/1000, *z + h * l1 /2/1000);
 k3 = f(*x + h / 2, *y + h * k2 / 2/1000, *z + h * l2 /2/1000);
 l3 = g(*x + h / 2, *y + h * k2 / 2/1000, *z + h * l2 /2/1000);
 k4 = f(*x + h, *y + h * k3/1000, *z + h * l3/1000);
 l4 = g(*x + h, *y + h * k3/1000, *z + h * l3/1000);
 *x += h;
 *y += h * (k1 + 2 * k2 + 2 * k3 + k4)/6/1000;
 *z += h * (l1 + 2 * l2 + 2 * l3 + l4)/6/1000;
 return;
}

long f(long x,long y,long z)
{
 return 0*x + 0*y + z;
}

long g(long x, long y, long z)
{
 return 0*x - 3000*y/1000 - 500*z/1000;
}

int main(void){
 long x = 0, y= 500, z = 1000, xmax = 10000, h;
 int i, n = 100;
 
 h = (xmax - x) / n;
 for(i = 1; i<=n ; i++){
  printf("%4d %d %d %d \n",i,x,y,z);
  drunge(&x,&y,&z,h,f,g);
 }
 return 0;
}



あと、今までルートってどうやって求めればいいんだろう?と思っていたんですが、ちょっと調べて見るとえらく簡単に求められるみたいですね。ちょっと目からウロコ。
これも固定小数点で計算できるようにしました。
これも10000倍しているだけなんですけどね。(10000倍だから、返ってくる値は100倍になります)

int sqrt(long a){
 long b;
 int i;
 
 a = 10000*a;
 b=a;
 for(i=0;i<20;i++){
 b = (b + (a/b))/2;
 }
 return(int(b));
}



PR
この記事にコメントする
NAME
TITLE
MAIL
URL
MESSAGE
PASS   Vodafone絵文字 i-mode絵文字 Ezweb絵文字

この記事へのトラックバック
この記事にトラックバックする:
忍者ブログ [PR]

Designed by A.com