spin on the RITZ -65ページ目

きんじかい

近似解を求める。

2分法
逆線形補間法

ニュートン・ラプソン法


一般的に、計算速度はニュートン・ラプソン法、逆線形補間法、2分法の順に長くなります

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

double NewtonRaphson(double x, double eps, int max, int *n);
double Bisection(double x1, double x2, double eps, int max, int *n);
double InverseLiner(double x1, double x2, double eps, int max, int *n);
double func(double x);
double dfunc(double x);

int main(void)
{
    double eps = 0.00001;
    double x1 = -1.0, x2 = 1.0, ret;
    int n, max = 1000;

    /*
    printf("x1 = ");
    scanf("%lf", &x1);
    printf("x2 = ");
    scanf("%lf", &x2);
    printf("ε = ");
    scanf("%lf", &eps);
    printf("最大反復回数 = ");
    scanf("%d", &max);
    */

    ret = Bisection(x1, x2, eps, max, &n);
    printf("--Bisection method--\n");
    printf("反復回数 : %d\n", n);
    printf("x = %lf\n\n", ret);

    ret = InverseLiner(x1, x2, eps, max, &n);
    printf("--Inverse Liner Interpolation method--\n");
    printf("反復回数 : %d\n", n);
    printf("x = %lf\n\n", ret);

    ret = NewtonRaphson(x1, eps, max, &n);
    printf("--Newton Raphson method--\n");
    printf("反復回数 : %d\n", n);
    printf("x = %lf\n\n", ret);

    return 0;
}

double NewtonRaphson(double x, double eps, int max, int *n)
{
    int i;
    double next_x;

    for (i = 0;i < max;i++) {
        next_x = x - func(x) / dfunc(x);
        if (fabs(x - next_x) < eps) {
            *n = i + 1;
            return x;
        }
        x = next_x;
    }
    *n = -1;
    return x;
}

double Bisection(double x1, double x2, double eps, int max, int *n)
{
    double x;
    int i;

    for (i = 0;i < max;i++) {
        x = (x1 + x2) / 2.0;
        if (func(x)*func(x1) < 0)
            x2 = x;
        else
            x1 = x;
        if (fabs(x1-x2) < eps) {
            *n = i + 1;
            return x;
        }
    }
    *n = -1;
    return x;
}

double InverseLiner(double x1, double x2, double eps, int max, int *n)
{
    double x;
    int i;

    for (i = 0;i < max;i++) {
        x = (x1*func(x2) - x2*func(x1)) / (func(x2) - func(x1));
        if (func(x)*func(x1) < 0)
            x2 = x;
        else
            x1 = x;
        if (fabs(x1-x2) < eps) {
            *n = i + 1;
            return x;
        }
    }
    *n = -1;
    return x;
}

double func(double x)
{
    return x - cos(x);
}

double dfunc(double x)
{
    return 1 + sin(x);
}

あとで

GdkPixbuf

今日も一人で計算機室に引きこもる


朝ちょっとやってたんだけど、どうにもこうにも画像が各行1ピクセルくらいずつずれていく…

ソース見直し

実行

を延々繰り返すのはきっついですよ本当に


どうやら画像の横幅に問題があるらしくって、4で割りきれないとパディング入れてるみたい

これ気づくのに1時間弱かかったぞ…
そういえば家でBMPファイル扱ってるときも同じ状態に陥ってました
あの時はメモリに入れる時にパディング削除してたので、関数戻り値のguchar配列にはパディング入れてないと思い込んでましたorz


それに気づいたら後はヨイヨイで完成

先生のソースは参考にならん
パディング無視してるから、保存するときずれるわ

今度わからないふりして質問してやろう

お腹減った

バイト終了~


授業の後にバイト先へ直行するのはちょっとしんどい
それ以上に空腹がつらい

何か買って食べればいいけどお金持ったいないし


眠くなるかなぁーとは思いましたが、今日は大丈夫でした



本当は給料日明日だけど今日もろた!
お財布ほくほくwww
45000円も貰ったwWii買えるww


取り敢えず壊れかけのレディオつき携帯買い替えに2万くらい使ってーバスに5000円くらい使ってー後は経費はないかなー

20000円も自由に使えるww





お金稼ぐのって大変だなぁますますケチに拍車がかかりそうです



家帰ったらすること
・レポートの下書き
・4値ディザリング
・FE試験勉強
・ご飯食べる!!

chmod 700 file

家では今のところGTK+が出来ないので、大学のLinuxでGTKを使ってみました


家で画像をいじる時はBMP扱えるクラスを使ってて、(i,j)の赤要素には

変数[j][i].r

でアクセス出来るようにしてあるけど、普通は

変数[(j * 横幅 + i) * 3]

でアクセスするもんみたいね。
メモリ確保とかが楽だからかなぁ


chmodで色々とパーミッション変更する必要があるみたいですね
chmod久しぶりに使った
mkdirも久しぶりに使った


gtkのリファレンスみないとな