マンガでよめる痔のこと・薬のこと

f(t)=at+bsint a,bは定数、f(t)は単調増加関数とする

f(t)=S(定数)となるときのtの値を近似的に求めるよい手段はありますでしょうか。
組み込みプログラムによって実現したいため、"よい"の基準は計算量と近似の正確さのバランスだと考えています。

今のところ、動的計画法を用いた2分探索と線形補完でtの値を求めようと思っていますが、
漠然ともっと計算量が少なくて済む方法があるような気がしています。

A 回答 (2件)

小さい書き違えもいくつかあったから書き直した。


f(t)=at+b sin t-S=0__①を解け。a,bは定数、f(t)は単調増加関数とする。
単調増加の条件は|b/a|≦1である。
①を②に変形する。
t+(b/a)sin t-S/a=0__②
2、S/aを2πで割って、tの範囲を限定する。
S/2πaの整数部分をn、端数をyとする。③④とする。
S/a=2πn+y__③
t=2πn+x__④
③④を②に入れると⑤になり、式⑥を得る。
2πn+x+(b/a)sinx-(2πn+y)=0__⑤
x+(b/a)sinx-y=0__⑥
⑥は②と同じ形の方程式だが、yとxが式⑦の範囲に限定される。
0≦x<2π,0≦y<2π__⑦
y=0またはy=πのとき
x=0またはx=πが解である。
3,0≦y<πと0≦x<πに限定する。
(1)0≦y<πの場合x=x0,y=y0__⑧とする。⑥に入れると
x0+(b/a)sinx0-y0=0__⑨
(2)y=2π-y0、x=2π-x0__⑩と置く。
y0=2π-y、x0=2π-x0__⑪になる。⑩を⑥に入れると
2π-x0-(b/a)sinx0-(2π-y0)=0__⑫
x0+(b/a)sinx0-y0=0__⑬
⑬は⑨と同じ方程式になるので、同じ方法で解いて、x0を得たら⑩によりx=2π-x0を得る。
4、第1近似zの計算
⑨と⑬を解くためにx0=π/2+z__⑭と置く。これを⑨に入れると⑮となる。
π/2+z+(b/a)sin(π/2+z)-y=0
π/2+z+(b/a)cosz-y=0__⑮
cosz=1-z²/2__⑯の近似を行い2次方程式を解く。⑯を⑮に入れると⑰になる。
π/2+z+(b/a)(1-z²/2)-y=0,(a/b)をかけると
(a/b)π/2+(a/b)z+1-z²/2-(a/b)y=0
-z²/2+(a/b)z+1+(a/b)(π/2-y)=0__⑰
-(z-a/b)²/2+(a/b)²/2+1+(a/b)(π/2-y)=0
-(z-a/b)²/2+D/2=0
⑰の2次方程式を解くと⑱になる。
z= a/b-√D__⑱
D=(a/b)²+2+(a/b)(π-2y)__⑲
⑱のzから⑭により、x0を得る。
x0=π/2+z__⑳
(1)0≦y<πの場合⑧よりx1=x0__㉑によりxの第1近似x1を求める。
(2)π≦yのとき⑩よりx1=2π-x0__㉒によりxの第1近似x1を求める。
5、ニュートンの方法
式⑥の方程式を㉓とし、その微分を㉕とする。
f(x)=x+(b/a)sinx-y=0__㉓,K=b/a__㉔
f '(x)=1+ Kcosx__㉕
㉓㉔㉕の関数と、1次近似のx1を使って、式㉖により、2次近似をx2とする。
x2=x1-f(x1)/f ' (x1) __㉖
x2を㉖の右辺のx1の代わりに入れると、㉗により第3近似を得る。この近似を繰り返すとすぐ収束する。
x3=x2-f(x2)/f ' (x2) __㉗
6、数値例 a=b=1、S=100とする。
③S/2πa= 15.9154943091895
n=15,y= 5.75222039230621
⑱z=-1.2538107338113
⑳x0=π/2+z=0.316985592983593
㉒x1=5.96619971419599
㉖x2=x1-f(x1)/f'(x1)= 6.01631019900819
 x3=x2-f(x2)/f'(x2)= 6.01612117972888
 x4=x3-f(x3)/f'(x3)=6.01612117733027
x5=x4-f(x4)/f'(x4)=6.01612117733027 ニュートン法は収束した。
Excelで計算すると一瞬で答えが出る。
    • good
    • 0
この回答へのお礼

丁寧に回答頂きありがとうございました。とても参考になりました。
精度と計算量の比較を行ってみたいと思います。

ニュートン法は1次近似のよい選び方が分からず、適当に選ぶと計算量が増えてしまうかと思っていました。
マクローリン展開でうまく解けるように持っていった部分に特に感心しました。
※定義について、端数をx/2π、y/2πと定義したのだと解釈しました。

お礼日時:2018/11/28 09:43

f(t)=at+b sin t-S=0__①を解け。

a,bは定数、f(t)は単調増加関数とする。
単調増加の条件は|b/a|≦1である。
①を②に変形する。
t+(b/a)sin t-S/a=0__②
2、S/aを2πで割って、tの範囲を限定する。
S/2πaの整数部分をn、端数をyとする。③④とする。
S/a=2πn+y__③
t=2πn+x__④
③④を②に入れると⑤になり、式⑥を得る。
2πn+x+(b/a)sinx-(2πn+y)=0__⑤
x+(b/a)sinx-y=0__⑥
⑥は②と同じ形の方程式だが、yとxが式⑦の範囲に限定される。
0≦y<2π__⑦
y=0またはy=πのとき
x=0またはx=πが解である。
3,0≦y<πと0≦x<πに限定する。
(1)0≦y<πの場合x=x0,y=y0__⑧とする。⑥に入れると
x0+(b/a)sinx0-y0=0__⑨
(2)y=2π-y0、x=2π-x0__⑩と置く。
y0=2π-y、x0=2π-x0__⑪になる。⑩を⑥に入れると
2π-x0-(b/a)sinx0-(2π-y0)=0__⑫
x0+(b/a)sinx0-y0=0__⑬
⑬はと同じ方程式になるので、同じ方法で解いて、x0を得たら⑩によりx=2π-x0を得る。
4、第1近似zの計算
⑨と⑬を解くためにx0=π/2+z__⑭と置く。これを⑨に入れると⑮となる。
π/2+z+(b/a)sin(π/2+z)-y=0
π/2+z+(b/a)cosz-y=0__⑮
cosz=1-z²/2__⑯の近似を行い2次方程式を解く。⑯を⑮に入れると⑰になる。
π/2+z+(b/a)(1-z²/2)-y=0,(a/b)をかけると
(a/b)π/2+(a/b)z+1-z²/2-(a/b)y=0
-z²/2+(a/b)z+1+(a/b)(π/2-y)=0__⑰
-(z-a/b)²/2+(a/b)²/2+1+(a/b)(π/2-y)=0
-(z-a/b)²/2+D/2=0
⑰の2次方程式を解くと⑱になる。
z= a/b-√D__⑱
D=(a/b)²+2+(a/b)(π-2y)__⑲
⑱のzから⑭により、x0を得る。
x0=π/2+z__⑳
(1)0≦y<πの場合⑧よりx1=x0__㉑によりxの第1近似x1を求める。
(2)π<yのとき⑩よりx1=2π-x0__㉒によりxの第1近似x1を求める。
4、ニュートンの方法
式⑥の方程式を㉓とし、その微分を㉔とする。
f(x)=x+(b/a)sinx-y=0__㉓
f '(x)=1+(b/a)cosx__㉔
㉓㉔の関数と、1次近似のx1を使って、式㉕により、2次近似をx2とする。
x2=x1-f(x1)/f ' (x1) __㉕
x2を㉕の右辺のx1に入れると、㉖により第3近似を得る。この近似を繰り返すとすぐ収束する。
x3=x2-f(x2)/f ' (x2) __㉖
5、数値例
よく計算してから投稿する。
    • good
    • 0

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

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

Q極限を求める問題なのですが、解答の過程を書いていただきたいです。お願いします。

極限を求める問題なのですが、解答の過程を書いていただきたいです。お願いします。

Aベストアンサー

lim記号は省略。

3/√(4n^2+2n)-2n
=3・(√(4n^2+2n)+2n)/(√(4n^2+2n)-2n)・(√(4n^2+2n)+2n)
=3・(√(4n^2+2n)+2n)/4n^2+2n-4n^2
=3・(√(4n^2+2n)+2n)/2n
=3・{√(4+2/n)+2}/2
=3・(√4+2)/2
=3・4/2
=3・2
=6

5/√(n^2+2)-√n
=5・(√(n^2+2)+√n)/(√(n^2+2)-√n)(√(n^2+2)+√n)
=5・(√(n^2+2)+√n)/(n^2+2-n)
=5・√(1/n^2+2/n^4)+√(1/n^3)/(1-1/n+2/n^2)
=5・(0+0)/1
=0

Q数A 確率の問なのですが、解答の式ではA地点からC地点までしか考えられていないように思います。C地点

数A 確率の問なのですが、解答の式ではA地点からC地点までしか考えられていないように思います。C地点からB地点はなぜ考えられていないのですか?

Aベストアンサー

ただし、最短距離を選ぶものとし、2通りの選び方のある交差点では、どちらを選ぶかは1/2の確率である。
この文章の意味は、
A→Cから上のコースでBに行った確率は、A→Cの確率・1/2
A→Cから下のコースでBに行った確率は、A→Cの確率・1/2
よって、合計して
A→CからでBに行った確率は、A→Cの確率・(1/2+1/2)=A→Cの確率でよい!

Q16の(2)についてです。どうしてa=2で重解であることがわかるのか分かりません。解説お願いします。

16の(2)についてです。どうしてa=2で重解であることがわかるのか分かりません。解説お願いします。結果的にそうなったのでは無さそうです。

Aベストアンサー

#2説明が悪かったので訂正

A(またはAに非常に近い点A')から引いた接線と3次曲線の接点がB(a,f(a))です。
ここで画像のように、(2,0)からわずかにずれた点A'から曲線に接線を引くものとします。
この場合でも、模範解答(2)のaの3次方程式が(近似的に)得られたとすれば
画像では3本の接線が引けていますのでこの3次方程式は3つの異なる解を持つはずです。(aは接点のx座標を表していますから)
さて、A'をAに近づけていくことを考えましょう。A'とAが近づくほどにB(黒)とB(青)も近づいていきますよね。そしてA'とAが重なるときに、B(黒)とB(青)もピッタリ重なります。
ピッタリ重なる前は、接点が3つですからaの3次方程式も解は3つです
ピッタリ重なった時、B(黒)のx座標と、B(青)のx座標は一致することになるので
それぞれのx座標を表すaは重なり結果重解となるわけです。
その重な地点がx=a=2という事ですね^-^

(以上直感的解説でした。)

Qこのプログラミングの問題がいくら考えてもわかりません。for文とif文を組み合わせて使うと言われたの

このプログラミングの問題がいくら考えてもわかりません。for文とif文を組み合わせて使うと言われたのですが、よろしければ教えてください

Aベストアンサー

No.1です、
念のための追加です。

日本語で「〇〇の値が××だったら、、、。そうでなかったら~。」といった表現で書かれたものが多くのプログラミング言語ではifを用いた処理になります。
同じく「〇〇の値が××になるまで、、、を繰り返す。」といった表現で書かれたものfor文やwhile文を用いた処理になります。

参考まで。

Q長方形の対角の寸法を普通の電卓で計算出来ますか? 関数電卓を使わずに、普通の電卓で計算出来るのなら、

長方形の対角の寸法を普通の電卓で計算出来ますか?
関数電卓を使わずに、普通の電卓で計算出来るのなら、教えていただけますか?

Aベストアンサー

√キーとメモリ機能があれば簡単。
ピタゴラスの定理を使う。
縦a、横bとすると、a×a=の答えをM+(メモリー+キー)、b×b=の答えをM+(メモリー+キー)、MR(メモリーリコール)、√
で出た答えが、対角線の長さ

Q計算の問題でどうしてこうなるのかわかりません(どうしてこうなった?の部分)

計算の問題でどうしてこうなるのかわかりません(どうしてこうなった?の部分)

Aベストアンサー

r^6=(r^3)^2 だから、 r^6-1 を a^2-b^2=(a+b)(a-b) を利用して因数分解すればよい

あとは、約分

Q12と13の計算式を教えてください

12と13の計算式を教えてください

Aベストアンサー

【問12】
10%を何倍に希釈すれば0.1%になるか考えます。
10倍なら1%、100倍なら0.1%、x倍なら10/x%です。
求める水溶液の量は

 元の製剤の量×希釈倍率=20×10/0.1=20×100=2000(ml)

【問13】
消毒には0.05%グルコン酸クロルヘキシジン液を用いるので、必要なグルコン酸クロルヘキシジンの量は

 10ℓの0.05%=10×0.05/100=0.005(ℓ)=5(ml)

20%グルコン酸クロルヘキシジンに換算すると

 5÷20/100=25(ml)

QC言語、関数を用いたプログラムがうまくいきません。

C言語で、以下の漸化式について
T(0)=1
T(1)=X             のとき

T(k+1)=2XT(k)-T(k-1)    (k = 0,1,2...,20)
を、kを20以下の自分の好きな値を入力して、計算を回して出力するプログラムを以前作りました。


以下にプログラムの内容と結果を書きます。
#include <stdio.h>
#include <math.h>

int main()
{
double x ;
int k ;
int K ;
double T[20] ;

printf("k = ") ;
scanf("%d", &K) ;

printf("x = ") ;
scanf("%lf", &x) ;

T[0] = 1 ;
T[1] = x ;

for (k = 1; k < K; k++) {
T[k+1] = 2 * x * T[k] - T[k - 1];
}

for (k = 0; k <= K; k++) {
printf("T[%2d] = %f\n",k,T[k]);
}
return 0 ;
}

//結果//
k = 5
x = 2
T[ 0] = 1.000000
T[ 1] = 2.000000
T[ 2] = 7.000000
T[ 3] = 26.000000
T[ 4] = 97.000000
T[ 5] = 362.000000

k = 4
x = 3
T[ 0] = 1.000000
T[ 1] = 3.000000
T[ 2] = 17.000000
T[ 3] = 99.000000
T[ 4] = 577.000000


今回は上記のプログラムを、関数を使って作りました。
以下にプログラムの内容と結果を書きます。


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

double t[20];

double T(double x, int k)
{
if (k = 0)
{
return 1 ;
}

if (k = 1)
{
return x ;
}

else
{
return 2 * x * t[k] - t[k - 1];
}

}

int main()
{
double x ;
int k, K ;
double t[20];

printf("k = ") ;
scanf("%d", &K) ;

printf("x = ") ;
scanf("%lf", &x) ;

for (k = 0; k <= K; k++)
{
printf("T[%2d] = %lf\n",k,T(x,k));
}
return 0;
}


//結果//
k = 5
x = 2
T[ 0] = 2.000000
T[ 1] = 2.000000
T[ 2] = 2.000000
T[ 3] = 2.000000
T[ 4] = 2.000000
T[ 5] = 2.000000

k = 4
x = 3
T[ 0] = 3.000000
T[ 1] = 3.000000
T[ 2] = 3.000000
T[ 3] = 3.000000
T[ 4] = 3.000000


このように、計算がうまくいきません。
何を直せばうまくいくかなど教えていただけると嬉しいです。
また、C言語、プログラミング初心者なので、わかりやすく丁寧に教えていただけると助かります。
よろしくお願いします。

C言語で、以下の漸化式について
T(0)=1
T(1)=X             のとき

T(k+1)=2XT(k)-T(k-1)    (k = 0,1,2...,20)
を、kを20以下の自分の好きな値を入力して、計算を回して出力するプログラムを以前作りました。


以下にプログラムの内容と結果を書きます。
#include <stdio.h>
#include <math.h>

int main()
{
double x ;
int k ;
int K ;
double T[20] ;

printf("k = ") ;
scanf("%d", &K) ;

printf("x = ") ;
scanf("%lf", &x) ;

T[0] = 1 ;
...続きを読む

Aベストアンサー

C言語における比較演算子は"=="
"="は代入演算子。
if文の()の中が全て"="になっていますね。これを全て"=="に変えましょう。

if(k=0)
はkに0を代入。そしてその代入した値がその式の値として評価されます。
つまり、k=0は偽として処理される。(C言語において式の値が"0"=偽)
kの値はこの時点で"0"になっている。

if(k=1)
kに1が代入される。そしてその式の値は"1"であり真(C言語において式の値が"0"以外=真)
真であるため、ifの後の{}中の式が実行される。return文なのでここでこの関数は終了される。
要するにxの値がそのまま出力される。
当然それ以下の式は実行されない。

Q標準状態での気体に関してです。 22.4Lで気体がx molあるなど書いてありますが、その気体の標準

標準状態での気体に関してです。
22.4Lで気体がx molあるなど書いてありますが、その気体の標準状態の定義を作る際に22.4Lの空間に気体のmolを満杯にして、定義を作ったのでしょうか?
要は体積22.4の中をある気体を満タンにした状態での質量や密度を「標準状態」と置いたのでしょうか?

Aベストアンサー

大丈夫かな?
気体を閉じ込める境界が作るものが体積。
それが物体として存在するかは別の話。

また気体が動的に流動しているうちは
気体状態方程式は成り立たない。
マクロの系が安定した状態を考えるべき。

Qもっとも簡単な解き方の解説と答えを教えてください。

もっとも簡単な解き方の解説と答えを教えてください。

Aベストアンサー

No.1です。「補足」に書かれたことについて。

>Fa*cos(30°)をどこから見出だしたのでしょうか。

下図を書いてみました。
「鉛直上向き」が「 Fa*cos(30°) + Fb*cos(60°)」になることが分かりますね?

これと、「鉛直下向き」の Fc がつり合います。

水平方向には、左向きに「Fa*sin(30°)」が、右向きに「Fb*sin(60°)」 になることも分かりますよね? 図の書き方が悪いので、つり合っていないような長さになっていますが。(つまり、Fa はもっと大きく、Fb はもっと小さいということです)

#3さんのような「特殊テクニック」を使う手もありますが、どうしてこれでよいのかが分からないでしょうから、下図のように「鉛直方向、水平方向に分けて考える」という「基本に忠実に」やるのが正攻法で、結果的には「一番簡単な、一番わかりやすい」方法だと思います。


人気Q&Aランキング