C言語関係掲示板

過去ログ

No.1182 直線による補間

[戻る] [ホームページ]
No.15471

直線による補間
投稿者---hiro(2004/07/13 10:21:22)


平面座標(x,y座標)に5個の点(x,y)=(1,3),(5,4),(6,8),(9,23),(15,13)、が与えられる時、任意の点x1におけるy1の値を直線による補間で求めるプログラムを作りたいのですが、本を読んでも多項式法しか載っていないのでわかりません。どなたか教えて頂けますか?当方bccを使用しています。


No.15495

Re:直線による補間
投稿者---ぽへぇ(2004/07/13 19:31:00)


>直線による補間で求める
2点あれば、それを満たす直線の方程式がわかりますが…。
そういう問題でなければごめんなさい。



No.15499

Re:直線による補間
投稿者---hiro(2004/07/14 08:50:23)


>2点あれば、それを満たす直線の方程式がわかりますが…。
>そういう問題でなければごめんなさい。
おっしゃるとおりです。
例えば、(x,y)=(1,3)(5,4)の間にある点(3,a)を求めたいときに、2点を通る直線の方程式を求めて、x=3,y=aを代入してaの値を導く。こういったことを(x,y)のグラフ上のある任意の点のy座標を導くものと考えて頂ければよろしいかと思います。



No.15501

Re:直線による補間
投稿者---REE(2004/07/14 10:04:07)


>例えば、(x,y)=(1,3)(5,4)の間にある点(3,a)を求めたいときに、2点を通る直線の方程式を求めて、x=3,y=aを代入してaの値を導く。こういったことを(x,y)のグラフ上のある任意の点のy座標を導くものと考えて頂ければよろしいかと思います。

それが分かっているのであれば、問題なくプログラムが作成できると思うのですが、何が知りたいのでしょうか?



No.15566

Re:直線による補間
投稿者---monkey(2004/07/16 01:26:26)


大サービス
#include <stdio.h>
#define N  5
const double x[ N ] = { 1.0, 5.0, 6.0,  9.0, 15.0 };
const double y[ N ] = { 3.0, 4.0, 8.0, 23.0, 13.0 };

int main()
{
    double xt;
    scanf( "%lf", &xt );

    if( x[ 0 ] <= xt && xt <= x[ N - 1 ] )
    {
        int i;
        for( i = 1; i < N; ++i )
        {
            if( xt <= x[ i ] )
            {
                double a = ( y[ i ] - y [ i - 1 ] ) / ( x[ i ] - x[ i - 1 ] );
                double b = ( x[ i ] * y [ i - 1 ] - x[ i - 1 ] * y[ i ] ) / ( x[ i ] - x[ i - 1 ] );
                printf( "x = %lf, y = %lf\n", xt, a * xt + b );
                break;
            }
        }
    }
    else
        printf( "out of range\n" );

    return 0;
}



No.15588

Re:直線による補間
投稿者---hiro(2004/07/16 13:16:17)


皆様、どうもありがとうございました。
monkeyさん、ソースまで頂いてありがとうございます。
monkeyさんのソースを引用させて頂きますと、
if( x[ 0 ] <= xt && xt <= x[ N - 1 ] )
{
int i;
for( i = 1; i < N; ++i )
{
if( xt <= x[ i ] )
この部分が解っていなかったため、
if(1<x<5)
.
.
.
if(9<x<15)
と場合分けをやらないといけないものだと思ってました。
このため、データが増えると一々場合分けを変えていかないといけないため、もっと良いプログラムはできないものかと困っておりました。

どうもありがとうございました。


No.15589

Re:直線による補間
投稿者---monkey(2004/07/16 13:49:30)


>if(1<x<5)
>.
>.
>.
>if(9<x<15)
>と場合分けをやらないといけないものだと思ってました。

間違いじゃありません.

>このため、データが増えると一々場合分けを変えていかないといけないため、もっと良いプログラムはできないものかと困っておりました。

であれば,自分が思いついたロジックに基づいて作成したコードを示した上で,「○○のように改良したいが,××の方法が分からないので教えてほしい」というような質問の仕方をすべきでしたね.


No.15569

Re:直線による補間
投稿者---たいちう(2004/07/16 09:35:39)


一番初めの質問を読んだときには、最小二乗法で直線の方程式を
計算する話だと思ったのですが、どうやら違うのでしょうか。

もしそうなら「最小二乗法」で検索しソースを探すか、
統計学等の入門書で最小二乗法を学習し(この問題なら
十分手で計算できます)、その方法をコーディングするか。

私の解釈ともmonkeyさんの解釈とも違う場合は、落ち着いて
もう一度説明してください。