次のような課題が出ました. ---- データ(x_i, y_i) [i=(1,2,・・・,N)] を直線近似する. 直線とそれぞれの点との 距離r_i の距離の和 Σr_i を最小にする直線を求める方法でプログラミングせよ. ---- 直線( ax + by + c = 0 )と点 (x_i, y_i) との距離は r_i = | a * x_i + b * y_i + c | / sqrt{a^2+b^2} なので,距離の和は Σr_i であり,これが最小になる a, b, c を求めればいいことはわかったのですが, ここから先がわからないので,ヒントください.
>934 最小自乗法の式の展開は理解できたのですが, r_i = | a * x_i + b * y_i + c | / sqrt{a^2+b^2} は絶対値の記号が入っているために,どうやって 偏微分,その後の展開をしたらいいかわかりません. よろしくおねがいします.
936 :
デフォルトの名無しさん :03/06/06 23:58
>>934 最小二乗法の結果は距離の和を最小にしない
939 :
デフォルトの名無しさん :03/06/07 10:00
動的データ構造と線形リストがわかりません
そうか
動的データ構造: 静的でないデータ構造 線形リスト:線の形のリスト
数学の知識が工房程度しか無いのですが、
>>933 の課題は
直線 y = ax + b と点 ( x_i, y_i )を点( 0, b )を中心にarctan(a) (=sとする)度回転させて、考える。
直線 y = b と 点(0, x_i*sin(s) + y_i*cos(s) )の距離の和、つまり
Σ( x_i*sin(s) + y_i*cos(s) - b ) が最小になるような s を求める。でaが求まる?
そしたら s を固定して b を求める。
というやり方で楽にできますか?
あ、-arctan(a)度かぁ?
乱数の種を変えて、10回の独立な計算をして、分散の平均値をとりたいのですが、次のプログラムをどういじったらいいですか?自分なりにやってみたんですが、値がおかしくなってしまい、どこがおかしいのかもわからないんです。
#include <stdio.h> #include <stdlib.h> #include <math.h> static unsigned long seed ; #define a 1664525 #define b 1 #define m 4294967296 #define N 100 void usr_srand(unsigned long s) { seed = s; } double usr_rand(void){ seed = ( a * seed + b ) % m; return (double)seed / m; }
main() { double z ,v ,r, s ,t ,q ,ave ,bun ; long l , n , k , i , j , u , sum , p , wa , wb , h[N] ; usr_srand(137); u = 0; wa = 0; wb = 0; v =0; for (i = 0; i < N; i++){ h[i] = 0; } for (l =0; l < 10000; l+=100){ for (i = 0; i < N; i++) { s = usr_rand(); r = usr_rand(); t = usr_rand(); q = usr_rand(); sum = 0; j = floor(r*N); p = h[j];
if ( t < 0.5 ){ h[j] = h[j] - 1; } else{ h[j] = h[j] + 1; } for (k = 1 ; k < N; k++){ sum = sum + fabs(h[k]-h[k-1]); } if ( sum-u <= 0 ){ u = sum ; } if ( sum-u > 0 && q <= exp(-1 / 0.6) ){ u = sum ; } if ( sum-u > 0 && q > 1 - exp(-1 / 0.6) ){ h[j] = p ; u = u ; } }
for (i = 0; i < N; i++){ wa = wa + h[i]; } ave = (double)wa / N ; v = v + ave ; z = v / (l/100 + 1) ; for (i = 0; i < N; i++){ wb = wb + pow(h[i] - z, 2); } bun = (double)wb / N ; printf("step=%d 分散=%f\n" , l+100 ,bun); wa = 0; wb = 0 ; } } これをいじってできるようにしたいのですが。。。
unsigned long int 符号無し倍長整数型 32bit 0〜4294967295
>>942 できない。
s= -atan(a);
Σ| x_i * cos(s) + (y_i - b) * sin(s) |
絶対値を取る必要がある。
構造体などについて質問させて頂いた829です。 皆様のアドバイスのおかげで、 なんとか金曜日中にレポートを提出することが出来ました。 本当に有難うございました。
あ、間違えた Σ| x_i * sin(s) + (y_i - b) * cos(s) |
954 :
デフォルトの名無しさん :03/06/08 01:33
>>948 for (i = 0; i < N; i++){
wb = wb + pow(h[i] - ave, 2);
}
じゃないの?
10回の独立な計算とか分散の平均値とかよくわからん。 何がしたいのか詳しく説明して。
マクスウェル方程式の導出 をプログラムにして
自然対数をだすプログラムを作成せよ
log
ガンダムのプログラム作って
>>959 学校名か、学部名か、学科名を教えて下さい。
962 :
デフォルトの名無しさん :03/06/08 06:05
最大25桁(少数も有り)の四則演算をしなければいけないのですが、 桁あふれしないようにするには、一体どうすればいいでしょうか?
d[25]
>>960 ホワイトファング所属
オペレーションメテオ科
>>962 mail(){long long double x;}
これがコンパイルできるなら long long double を使えば良い。
さもなくば多倍長数を使う。既存なら libmp か libruby など。もしくは自作。
Cを使わなくていいなら bc コマンドなど。
>>944 あんたの main を整理してみたがやっぱりやりたいことが分からん。
数学の試験問題程度に明確に書いてくれ。
(^^)(^^)(^^)(^^)(^^)(^^) (^^)(^^)(^^)(^^)(^^)(^^) (^^)(^^)(^^)(^^)(^^)(^^) (^^)(^^)(^^)(^^)(^^)(^^) 山崎渉
文字列を文字数の制限なしに入力するにはどうしたらいいですか? 文字数の制限というのはa[100]なら100文字(99?)までしか入れれないという感じのやつです どうかよろしくお願いします
>>968 一文字ごとに領域確保と解放を繰り返せ(w
適当な文字数毎にリンクリストに繋いでいくとか。 読んだ端からファイルに格納していくとか。 想定される最大文字数 (メモリーに入るのか否か) と、そのあとどう言うことしたいんだ ?
すいません、ホント宿題なので・・・ C言語でとりあえず文字列を文字数制限なく読み込めって感じの課題なので、 読み込んだことが分かるようにそのまま表示しようと思っています
>>971 文字の読み込みにはどの関数を使うん?
getchar?
バッファをreallocで伸長しながら読むとか。
特に指定なしです 最近習ったstrlenとmallocなどを使ってやるのかと思ったのですが、無理でしょうか?
>>975 じゃあ1文字ごとにmallocしてリストとして繋げばいいだろ。
どうも聞いてる限りでは大した課題じゃないっぽいし。
リスト構造の勉強にもなるし、いい機会じゃないか。
文字列を文字数制限なく読み込んで何するんだろ・・
文字数制限なく読み込むけど、 メモリへの格納何もしないプログラム #include <stdio.h> int main() { while( !feof(stdin) ) getchar(); } 読み込みつつ、全部表示するバージョン #include <stdio.h> int main() { while( !feof(stdin) ) putchar( getchar() ); }
文字数制限無しで読み込んで、格納先のアドレスを返す。ちゃんとfreeしてね。 けど多分、VCじゃないとコンパイル通らない。 char* hogealloc(void) { char*str; chardummy;/* 先頭1文字の格納先*/ scanf("%c", &dummy);/*stdinと関連付ける*/ if( ( str=(char*)calloc( stdin->_cnt+1, 1 ) ) == NULL ) { fprintf(stderr, "メモリの確保に失敗しました。\n"); exit(1); } strncpy(str, stdin->_base, stdin->_cnt); fflush(stdin); return str; }
#include <stdio.h> #include <string.h> #include <malloc.h> #include <stdlib.h> です。
>>979 おいおい、構造体FILEの実装に依存したコードかくなよ…
VC++じゃないと通らないというか、
VC++の特定のバージョンじゃないと通らないかも知れんぞ。
はい、それで無くても全然ダメっぽいです。 stdin->_cntで表現できない程の文字数は格納できないです。 でもそんな事言ってたら、reallocもsize_t型の変数で領域の大きさ指定するしなぁ。 それじゃ逝きます。さよなら!
便乗質問。 gcc -ansi -pedantic -Wall でワーニングもエラーも出なかったら、どのコンパイラでも OKと考えていいですか?
>>983 どのコンパイラでもコンパイルが通ることだけは期待できる。
が、それがちゃんと動くかどうかは別問題。
>>968 どの処理系でもイケるはず。
#include <stdio.h>
#include <stdlib.h>
#define CELL_SIZE 100
typedef struct cell {
char data[ CELL_SIZE + 1 ];
struct cell* next;
}cell_t;
cell_t* CreateCell() { return (cell_t*)calloc( 1, sizeof( cell_t ) ); }
void Cell_Display( const cell_t* cell ) {
while( cell != 0 ) {
fputs( cell -> data, stdout );
cell = cell -> next;
}
}
void Cell_Clear( cell_t* cell ) {
cell_t* target;
while( cell != 0 ) {
cell = ( target = cell ) -> next;
free( target );
}
}
int main(int argc, const char** argv) {
cell_t *head, *tail;
FILE* fp = 1 < argc ? fopen( argv[1], "r" ) : stdin;
tail = head = CreateCell();
while( !feof( fp ) )
fgets( ( tail = tail -> next = CreateCell() ) -> data, CELL_SIZE, fp );
Cell_Display( head );
Cell_Clear( head );
}
メモリ確保に失敗するのが恐いときは、 cell_t* CreateCell() { cell_t* cell = (cell_t*)calloc( 1, sizeof( cell_t ) ); if( cell == 0 ) exit(-1); return cell; } とでも。 # 未チェック。
987 :
デフォルトの名無しさん :03/06/08 14:04
8代目まだ?
>>985 CamelCase と underscore_delimited を混ぜたのは初めて見たかも
>>985 exit の直前に限っては free する必要はない。
>>983 あらゆるコンパイラがANSI Cに完全準拠しているわけじゃないし、ライブラリの問題もあるし。
線形リスとなんぞ使わなくても、これで十分だろ。 #include <stdio.h> #include <stdlib.h> int main( int argc, const char** argv ) { FILE* fp; char* buf; size_t size; if( fp = fopen( argv[1], "rb" ), fp == 0 ) { return -1; } fseek( fp, 0, SEEK_END ); buf = malloc( ( size = ftell( fp ) ) + 1 ); rewind( fp ); fread( buf, size, 1, fp ); buf[size] = '\0'; printf( "[%s]\n", buf ); }
>>991 うわー、絶対いっしょに仕事したくないタイプ。
>>992 なんで?カンマ演算子とか使ってるから?
めちゃ素直なコードだと漏れは思うよ。 fopen は検査して malloc は検査しないのは分からんが。
main()の戻り値に-1を使うような奴とは仕事したくないと言うなら
>>992 に同意。
>>978 下の方のプログラムは一文字余分に表示される。
プログラム板だと1000取り合戦も起こらないんですね
C++ >>>>>>> Java
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。