アプリ版:「スタンプのみでお礼する」機能のリリースについて

非線型方程式((a*a)+(x*x))(1-x)-bx=0 という式で a=0.07,b=0.10のときの解をすべて解きなさい(プログラムで2分法又はニュートン法を用いて解く)という問題を解きたいのですが色々なサイトを見てもわかりません

もしよろしければどなたか教えていただけませんか?
よろしくお願いします。

A 回答 (3件)

何が分からないのですか?

    • good
    • 0

2分法にしても、ニュートン法にしても、初期値の選び方を間違えると失敗するという、ちょっと手強い関数ですね。


ただ、「こんな場合にはうまくいきません」ということで、必ずテキストに説明があるケースなのでそこを復習するという感じかと。

ちなみに、f(x) = ((a*a)+(x*x))(1-x)-bx のグラフは添付した形になります。
難しさがわかっていただけるといいかなと。
「C言語で非線形方程式を解くプログラム」の回答画像2
    • good
    • 1

これは GnuPlot との併設が必要な引っかけ問題ですね。


http://t16web.lanl.gov/Kawano/gnuplot/

答えは、一見、3次方程式から3つあるように見えますが、実は一つなんですね。
x->+0 の箇所は、 y=0 であるかのように見えますが交わっておらず、y=0 に近似しており、そのxの値を得ようと精度を上げてやると無限ループに落ちてしまう、いやはや、やっかいな問題です。
出題者も良くおわかりのようで。まあ、 GOSA の精度をあげてお試しください。





/* 二分法:
result x= 0.879862 count= 9 gosa= 1.000000e-02
*/
#include <stdio.h>
#include <math.h>//sin(),cos()等用
#define GOSA1e-2 //←「1e-3」以上にすると無限ループに落ちる
#define BEGIN0.5 //0.0
#define END1.0 //0.2
#define F(x) (0.07*0.07+(x*x))*(1.0-x)-0.1*x

int main(void) {
int count = 0;
double x0, x1, x, f0, f1, tx, temp_fx = 1.0;

x0 = BEGIN;
x1 = END;
while (fabs(temp_fx) > GOSA) {
count += 1;
f0 = F(x0);
f1 = F(x1);
x = (x0 * f1 - x1 * f0) / (f1 - f0);
temp_fx=F(x);
fprintf(stderr, "%3d: \tx0= %f \tx1= %f\t x= %f \t fx= %f\n", count, x0, x1, x, temp_fx);
tx = x;
if (f0 * temp_fx < 0.0)
x0 = x;
else
x1 = x;
}
printf("result x= %f count= %d gosa= %e\n", x, count, GOSA);

return 0;
}
    • good
    • 0
この回答へのお礼

ありがとうございます。
これからもっと勉強してできるようにがんばります。

お礼日時:2011/01/14 10:57

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