「オイラー法の誤差を最小にするtの刻み幅」とは、どうやって求めるのでしょうか?丸め誤差の求め方も知らず、どうしたらいいかわかりません。

与えられている式は dx/dt=-2t^3+12t^2-20t+8.5 です。

A 回答 (1件)

 原始関数x(t)が解析的に求まるので、いろいろな刻み幅でオイラー法を繰り返して、解析解との差が最小になる幅を見つければよいでしょう。

積分区間にもよりますが、最初は幅を区間の1/10位にして、繰り返し毎に幅を半分にしていくというのはどうでしょうか。
 原始関数が解析的に求まらない場合は、刻み幅が十分小さければ、オイラー法の誤差は刻み幅に比例するという性質を使えば、横軸に刻み幅、縦軸に積分値をとってグラフを描けば、滑らかな曲線が得られるでしょう。刻み幅を小さくしすぎると、誤差の累積で滑らかな曲線からずれてくるでしょうから、どのあたりから誤差の影響が強くなるかが大体わかります。
 もし、もっと近似のよい方法(Runge-Kutta法など)を使ってよいのなら、解析解の代わりにこの近似のよい解との差がいちばん小さくなる刻み値をさがせばよいでしょう。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QLISPのマクロと他の言語のマクロの違い

LISPのマクロは強力と言われていますが、他の言語の言うマクロとはどう違うのでしょうか?

Aベストアンサー

ここでいう「マクロ」は一言で言うと「プログラムを生成する機能」ですね。
例えばCのマクロを例に上げますと、
#define MAX(a, b) (a) > (b) ? (a) : (b)
というようなマクロを定義すると、後に
MAX(10, x)
と書いた際に
(10) > (x) ? (10) : (x)
というプログラムがコンパイル時に生成されます。

Cなどのマクロは、マクロ専用の文法があり、
マクロで書けるものにはある程度の制限が付きます。例えば、
「マクロの引数が定数の際に奇数か偶数かで『生成するプログラム』を変える」
などといった複雑なことはできません。

一方、Lispのマクロは、Lispそのもので書くことが可能で、
任意のプログラムをマクロとして書くことができます。
マクロの中で条件分岐やループなど、なんでも出来てしまいます。
これにより、コンパイル時にマクロの引数の型や値に応じて
生成するプログラムを変えることで最適化を行ったり、
新たな言語機能(と対応する文法)を追加するようなことが可能です。

例えば、昔のLispにはオブジェクト指向の機能がありませんでしたが、
マクロを使うことで、後からオブジェクト指向の機能を付け加えることができました。
また、Common Lispのオブジェクト指向の機能が独特で嫌いな人は、
マクロを使うことでJava風のオブジェクト指向の機能を追加するようなことも可能です。
極端な話、Lispの上で別の言語が作れてしまうわけです。

コンパイル時に任意のプログラムを実行できるという点では、
C++のテンプレートとも似ているといえますが、
C++のテンプレートはテンプレート専用の文法を用いる必要ある点がLispと異なります。
C++をそれなりに書ける人でも、テンプレートで任意のプログラムを書こうとすると、
かなりの苦労を強いられます。テンプレートの文法がC++の文法と異なるのが苦労する原因の一つです。
一方、Lispのマクロは、Lisp自身で書けるため、
Lispが書ける人なら誰にだって書けてしまうわけです。

以上がLispのマクロが強力と言われる要因(の一部)です。
実際に使われてみると色々と実感できると思いますよ。

ここでいう「マクロ」は一言で言うと「プログラムを生成する機能」ですね。
例えばCのマクロを例に上げますと、
#define MAX(a, b) (a) > (b) ? (a) : (b)
というようなマクロを定義すると、後に
MAX(10, x)
と書いた際に
(10) > (x) ? (10) : (x)
というプログラムがコンパイル時に生成されます。

Cなどのマクロは、マクロ専用の文法があり、
マクロで書けるものにはある程度の制限が付きます。例えば、
「マクロの引数が定数の際に奇数か偶数かで『生成するプログラム』を変える」
などといった複雑なことはで...続きを読む

Qax^2+bx+c=0の解を求めたいのですが・・(初歩的です)

タイトル通り、a、b、cを入力させて、ax^2+bx+c=0の解xを求めたいのですが、結果をどう求めればいいのか、実解・虚数解・重解の場合をどうしたらいいのか、の2点がよくわかりません。

#include<math.h>
#include<stdio.h>
double sqrt(double a,double b,double c)
{
return (b*b-4*a*c);
}

main(void)
{
double a,b,c,sqrt,ans;
do{
printf("ax^2 + bx +c = 0 の解 x を求めます。\n a,b,cを入力してください。\n");
printf("a : "); scanf("%lf",&a);
printf("\nb : "); scanf("%lf",&b);
printf("\nc : "); scanf("%lf",&c);

if(a = 0){
printf("a は0以外を入力してください。\n");
}
}while(a = 0);

ans = (-b+dist(a,b,c))/(2*a);
printf("%lf", ans);
printf("\n");
return(0);
}


他にも多々ダメな部分があると思いますがご指摘・アドバイス等いただけたらと思います。よろしくお願いします。

タイトル通り、a、b、cを入力させて、ax^2+bx+c=0の解xを求めたいのですが、結果をどう求めればいいのか、実解・虚数解・重解の場合をどうしたらいいのか、の2点がよくわかりません。

#include<math.h>
#include<stdio.h>
double sqrt(double a,double b,double c)
{
return (b*b-4*a*c);
}

main(void)
{
double a,b,c,sqrt,ans;
do{
printf("ax^2 + bx +c = 0 の解 x を求めます。\n a,b,cを入力してください。\n");
printf("a : "); scanf("%lf",&a);
printf("\nb : "); scanf...続きを読む

Aベストアンサー

while(a=0);
は、
while(a==0.0);
だと思います。
#1の方と同じだけど
sqrtがdistの間違い
ans = (-b+dist(a,b,c))/(2*a);

distの前にsqrtが要る
ans = (-b+sqrt(dist(a,b,c)))/(2*a);
ans = (-b-sqrt(dist(a,b,c)))/(2*a);
の2つの場合を考えないといけない。

distの値で
0:重解
-:虚数解
+:実解
のように場合分けしないといけない

Qlispとその他関数型言語について

「lispを学べば悟りが開ける」という言葉をよく聞きます。

l他のプログラミング言語哲学とは一線を画すほどの教示をもった言語という印象を持ちます。

僕もlispを少し学んだだけですが「悟り」は開けませんでした。

しかし他の関数型言語(haskellとか)ではそういう話は聞きません。

なぜでしょうか。

やっぱ括弧ですか。

Aベストアンサー

他の言語が、まだまだ歴史が浅く、使っている人、特にカリスマと呼べるような人が少ないからではないでしょうか。
それに「haskellを学べば..」などといまさら言っても、二番煎じになってしまいますし。

QC言語でsqrt(a^2+b^2)のテーブル引き

プログラムに悩んでいるものです.

とある画像処理のプログラムを組んでいるのですが,処理が遅くテーブル引きを組んでいます.
三角関数などはすんなりできたのですが,質題にもある通りsqrt(a^2+b^2)が実現できず,この場を借りて質問させていただきました.
以下にプログラムの一部を示します.
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
void filter(unsigned char* d, short *dx, short *dy, int w, int h)
{
///// テーブル生成 /////
static int c_size = 0;// static 次の呼び出しでも値保持
static double *c_sqrt = NULL;//
c_size = 255;              // u,v:0~255
c_sqrt = (double *)malloc(sizeof(double)*c_size*c_size);// 領域確保
for(int i=0; i<c_size; ++i){    // 有りえるすべての値を生成
for(int j=0; j<c_size; ++i){
c_sqrt[i*j] = sqrt( (double)(i*i + j*j) );
}
}
///// d = sqrt(dx^2 + dy^2) /////
for(int y = 1; y < h-1; ++y){
for(int x = 1; x < w-1; ++x){
double u = (double)dx[y*w+x];
double v = (double)dy[y*w+x];
int val = (int)c_sqrt[ (int)(u*v) ] /4;
if (val>255) val=255;
d[y*w+x] = val;
}
}

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
見てご察し頂ける(?)と思いますが,この関数は何回も呼び出すので,上のほうででテーブル引きしようとしてます.
ただ明らかなプログラム経験不足のためかうまくいってません.
個人的にはc_sqrtを別途関数c_sqrt(u,v)にしたほうがよいのかと思ってます.
どういうプログラム記述をすれば,このテーブル引きが実現できるでしょうか?
ご回答,お力添え,よろしくお願い致します.

プログラムに悩んでいるものです.

とある画像処理のプログラムを組んでいるのですが,処理が遅くテーブル引きを組んでいます.
三角関数などはすんなりできたのですが,質題にもある通りsqrt(a^2+b^2)が実現できず,この場を借りて質問させていただきました.
以下にプログラムの一部を示します.
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
void filter(unsigned char* d, short *dx, short *dy, int w, int h)
{
///// テーブル生成 /////
static int c_size = 0;// static 次の呼び...続きを読む

Aベストアンサー

何をやりたいのか今ひとつ見えませんが、
c_sqrt[i*j] = sqrt( (double)(i*i + j*j) );
とやってしまうと、
i=2、j=8の時には
c_sqrt[16]=√(2*2+8*8)=√68

i=4、j=4の時は
c_sqrt[16]=√(4*4+4*4)=√32
ということで、c_sqrt[16]が上書きされてしまいますが、それで良いんでしょうか?

sqrt(a^2+b^2)
の値引きテーブルを作るならc_sqrt[a][b]のような二次元配列で用意してやるのが常道ではないかと思います。

QLISPで C言語のフォーマット書式の"%02d"

LISPで C言語のフォーマット書式の"%02d"にあたる記述の仕方がわかりません。どのようにすればよいのでしょうか?

Aベストアンサー

Common Lisp で良いのですよね?

(dolist (num '(5 10 200))
(princ (format nil "~2,'0D~%" num)))

実行結果:
05
10
200


format関数
http://www.yuasa.kuis.kyoto-u.ac.jp/~hiraisi/format-func.html

Qx^2+2x+1=0

x^2+2x+1=0をとく関数プログラムです。
うまくできません。どこが間違っているのでしょうか。
教えて下さい。

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

void input_keisuu(double a,double b,double c);
void solve(double a,double b,double c);


int main(void)
{
double a,b,c;

input_keisuu(a,b,c);
solve(a,b,c);
return 0;
}

void input_keisuu(double a,double b,double c)
{
puts("二次関数a*x^2+b*x+c=0を解きます。");

a=1;
b=2;
c=1;

puts("a=1");
puts("b=2");
puts("c=1");


}

void solve(double a,double b,double c)
{
double d;
double x;

d=b*b-4*a*c;

printf("判別式d= %f\n",d);

x=(-b+ sqrt(d))/(2*a);

printf("二つの解のうち大きい方はx=%f\n",x);

}

x^2+2x+1=0をとく関数プログラムです。
うまくできません。どこが間違っているのでしょうか。
教えて下さい。

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

void input_keisuu(double a,double b,double c);
void solve(double a,double b,double c);


int main(void)
{
double a,b,c;

input_keisuu(a,b,c);
solve(a,b,c);
return 0;
}

void input_keisuu(double a,double b,double c)
{
puts("二次関数a*x^2+b*x+c=0を解きます。");

a=1;
b=2;
c=1;

puts("a=1");
puts("b=2...続きを読む

Aベストアンサー

input_keisuu関数でセットした係数が、
solve関数に渡っていません。
input_keisuu関数の引数は、各係数のアドレスにしてください。

Qlispの入門書

lispの入門書を探しています。

lispの書き方をただ説明するだけでなく、他の言語と違ってどういう利点が
あるのかを説明したものがいいです。

なにかおすすめの本があったら教えてください。

Aベストアンサー

・The Little Schemer
Lispの最高の入門書です。一問一答を追っていくことで、リスト操作やLispプログラムを作っていく感覚について皮膚で理解できるようになります。
英語ですが、難しい文章はないのでそれほど問題ないはず。
環境の整えかたなどの記述はいっさいありません。 "Lisp" を実践して学ぶ本です。

・プログラミングGauche
Lispの方言の一つにSchemeという言語があります。その一つの処理系であるGaucheの本です。さいきん出たばっかり。
Gauche のさまざまな組み込み関数を利用することで関数型プログラミングを実践していきます。
日本語で勉強したいならこちらです。

・リスト遊び
日本語だとこの辺も入門書です。あまり詳しく知りませんが、Emacs Lispの本です。
筆者はEmacs上でemailを読めるMewというソフトウェアの開発者でもあるそうです。

Lispの良さについてはネット上の文章を読む方がよろしいかと。適当に、LispとかPaul GrahamとかShiroとかのキーワードを探してみてください。
「ハッカーと画家」を読むのも良いですね。


Lispコミュニティにコミットするのがいちばんですが。

・The Little Schemer
Lispの最高の入門書です。一問一答を追っていくことで、リスト操作やLispプログラムを作っていく感覚について皮膚で理解できるようになります。
英語ですが、難しい文章はないのでそれほど問題ないはず。
環境の整えかたなどの記述はいっさいありません。 "Lisp" を実践して学ぶ本です。

・プログラミングGauche
Lispの方言の一つにSchemeという言語があります。その一つの処理系であるGaucheの本です。さいきん出たばっかり。
Gauche のさまざまな組み込み関数を利用することで関数...続きを読む

Qtemplate A(const T &t=T())

template<class T> A(const T &t=T());
という関数宣言において引数のところの解釈に戸惑ってます
どういう風に解釈したらいいのか教えていただければ幸いです

Aベストアンサー

引数 t は型Tのconstな参照体であり、
T()をデフォルトとする。
# 戻り値がありませんよー

class Foo {
public:
Foo();
Foo(int);
...
}

Foo f(5);
A(f);
A(); // = A(Foo()) と同じ

Q初めて関数型言語を学ぶとしたら、どの言語がお奨めですか?

初めて関数型言語を学ぶとしたら、どの言語がお奨めですか?
JavaScriptをやっていて、関数型言語に興味を持ちました。

いままで、勉強した言語はC < Java < Python < JavaScriptです。(右側の方が比重・興味が大きい)
現在、Web系志望の学生なので、その辺を踏まえてアドバイスいただけると助かります。

今のところ興味を持ってるのは、Common Lisp/Haskellあたりです。

よろしくお願いします。

Aベストアンサー

C言語が「関数型」?なのか、と言われると多分違うと思うんですけどね。普通は命令型/手続き型に分類されるんじゃないか、と思います。

ちなみに、JavaScriptはSchemeに影響を受けてる言語です。それで言うと、SchemeかCommon Lispがいいんじゃないのかな、とは思いますがね。ただ、あんまり関数型、って感じで書かれている本は少ないと思います。

Web系志望と言う事なんで、Common Lispですと、

ANSI Common Lisp: http://www.pej-hed.jp/washo/288.html
にHTML生成のトピックあり。

実践Comon Lisp: http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=978-4-274-06721-1
にAllegro Serveと言うライブラリを利用したWebプログラミングの例があり。HTML生成の例もあり。
原著のサイトでは、
http://www.gigamonkeys.com/book/practical-web-programming-with-allegroserve.html
http://www.gigamonkeys.com/book/practical-an-html-generation-library-the-interpreter.html
http://www.gigamonkeys.com/book/practical-an-html-generation-library-the-compiler.html
辺り。

プログラミング言語Lisp: http://ascii.asciimw.jp/books/books/detail/4-7561-3926-4.shtml
CL-HTTPと言うライブラリを用いたWebサーバーの説明が載っています。
ただし、本自体はMacintosh用の商用実装、Mac Common Lisp

Mac Common Lisp:
http://www.digitool.com/

を用いたものなんで、注意する必要があります。Macを持ってないならあまりお薦めしません。また、若干古い本ですね。

Haskellの方は良く分かりませんが、Common LispならそれなりにWeb関係の簡単なアプリの書き方も紹介されている、と言う事です。

参考までに。

C言語が「関数型」?なのか、と言われると多分違うと思うんですけどね。普通は命令型/手続き型に分類されるんじゃないか、と思います。

ちなみに、JavaScriptはSchemeに影響を受けてる言語です。それで言うと、SchemeかCommon Lispがいいんじゃないのかな、とは思いますがね。ただ、あんまり関数型、って感じで書かれている本は少ないと思います。

Web系志望と言う事なんで、Common Lispですと、

ANSI Common Lisp: http://www.pej-hed.jp/washo/288.html
にHTML生成のトピックあり。

実践Comon Lisp: http://s...続きを読む

QC言語 最大値と最小値を求めて表示するプログラム

はじめまして。

C言語を学習中です。

下記の問題演習の解答として記載されているプログラムがどうしても理解できません。

特にプログラムの最後の方のwhile文で最大値と最小値の判定をしているのかと思いますが、どのような計算をして判定しているのでしょうか。

while (array[i] != -1) {
if (array[i] > *max) *max = array[i];
if (array[i] < *min) *min = array[i];
i++;

具体的に教えてください。

よろしくお願い致します。


●問題
0~100の範囲で入力された複数の数値の中から、
最大値と最小値を求めて表示するプログラムを作成せよ。
-1が入力された場合は入力の終わりと判定する。
ただし、最大値と最小値はmain関数以外の一つの関数の中で求める。
また、入力された数値を記憶する配列の要素数は10とし、
それ以上入力された場合はエラーが起きても仕方ないこととする。
ヒント:配列の中に -1 があればデータの終わりだと判断できる。
ヒント:最小値を探すには、最大値を記憶した変数との比較を繰り返せば良い。


●解答
#include <stdio.h>

void maxmin(int array[],int *max,int *min);

int main(void)
{
int i = 0,array[10],max,min;

do {
printf("%d 番目の数:",i + 1);
scanf("%d",&array[i]);
i++;
} while (array[i - 1] != -1);

maxmin(array,&max,&min);

printf("最大値 %d : 最小値 %d\n",max,min);

return 0;
}

void maxmin(int array[],int *max,int *min)
{
int i = 0;

*max = 0;
*min = 100;

while (array[i] != -1) {
if (array[i] > *max) *max = array[i];
if (array[i] < *min) *min = array[i];
i++;
}
}

はじめまして。

C言語を学習中です。

下記の問題演習の解答として記載されているプログラムがどうしても理解できません。

特にプログラムの最後の方のwhile文で最大値と最小値の判定をしているのかと思いますが、どのような計算をして判定しているのでしょうか。

while (array[i] != -1) {
if (array[i] > *max) *max = array[i];
if (array[i] < *min) *min = array[i];
i++;

具体的に教えてください。

よろしくお願い致します。


●問題
0~100の範囲で入力された複数の数値の中から、
最大値と最小値を求...続きを読む

Aベストアンサー

>while (array[i] != -1) {
>if (array[i] > *max) *max = array[i];
>if (array[i] < *min) *min = array[i];
>i++;

手でコードを追いかけていくのが上達への近道だとは思いますが…。

今回は、データの範囲が0~100と決まっていますので、
まずは、仮の最大値として下限の0を、仮の最小値として上限の100を、
それぞれセットしています。
そして、配列の中身を、その時点での最大値や最小値と比べて、
データの方がその時点での最大値よりも大きければ最大値の値を更新し、
データの方がその時点での最小値よりも小さければ最小値の値を更新する、
というアルゴリズムです。

ループを脱出した(つまり、すべてのデータをチェックし終わった)段階で
変数maxやminに入っている値が、(仮ではない)真の最大値や最小値となります。


人気Q&Aランキング

おすすめ情報