反復処理による2直線の交点の計算

y=ax+b で定義される2直線をランダムに生成し、その2直線が交わる交点(x,y)を反復処理により求める方法です。
多少お粗末な内容ですが、プログラミングの例題にはなるかもです。。

一般的な解法は別の機会に。。

反復処理による2直線の交点の計算list_47.c)
/*
  list_47.c: 反復処理による2直線の交点の計算
 */
#include <stdio.h>
#include <math.h>

#define P_MAX   10       // 各パラメータの最大値
#define ITR_MAX 10000    // 反復の最大数
#define E_MIN   0.1      // 交点評価値
#define X_MIN   -100     // X軸探索最小値
#define X_MAX   100      // X軸探索最大値
#define f(a,b,x) (a*x+b) // 直線の定義

double random(int max,unsigned long* idum);

int main()
{
    int i;
    double a1,a2,b1,b2;
    double x,y1,y2;
    unsigned long idum = time(NULL); /* 乱数の初期化 */
    
    /* 直線の変数の初期化: a=傾き, b=切片 */
    a1 = random(P_MAX,&idum);
    b1 = random(P_MAX,&idum);
    a2 = random(P_MAX,&idum);
    b2 = random(P_MAX,&idum);

    printf("直線の定義: \n\t(a:傾き,b:切片)\n");
    printf("直線1:a1=%.2lf,b1=%.2lf\n",a1,b1);
    printf("直線2:a2=%.2lf,b2=%.2lf\n",a2,b2);
    
    /* 反復計算による交点の計算 */
    printf("\n**反復開始\n");
    for(i=0;i<ITR_MAX;i++){
        x = X_MIN + i*(double)(X_MAX-X_MIN)/(double)ITR_MAX;
        y1 = f(x,a1,b1);
        y2 = f(x,a2,b2);
        if(fabs(y1-y2) < E_MIN){
            printf(" 交点:(%.2lf,%.2lf)\n",x,y1);
            break;
        }
    }
    return 0;
}

/* 0〜max までの乱数の発生(int型) */
double random(int max,unsigned long* idum)
{
    *idum=(*idum)*1103515245 + 12345;
    return (max * ((double)(*idum/65536 % 32768) / (double)32767));
}
実行結果
Gami[678]% list_47
直線の定義:
        (a:傾き,b:切片)
直線1:a1=3.81,b1=2.33
直線2:a2=1.39,b2=1.83

**反復開始
 交点:(-5.06,-7.98)
Gami[679]%
inserted by FC2 system