C言語 3次関数 変曲点

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
キマイラ

C言語 3次関数 変曲点

#1

投稿記事 by キマイラ » 9年前

C言語でy=4x^3+5x^2+6x+7の変曲点を求めるプログラムが作れません。

微分を使ってはいけないという条件付きです。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: C言語 3次関数 変曲点

#2

投稿記事 by h2so5 » 9年前

では手計算ならできるのでしょうか。

アバター
ookami
記事: 214
登録日時: 13年前
住所: 東京都

Re: C言語 3次関数 変曲点

#3

投稿記事 by ookami » 9年前

キマイラさん、
まず、左上の「フォーラムルールはこちら」を確認ください。赤いとこです。
次に、
1. 微分を用いないとなると、近似計算をさせたいのだと思いますが、求める精度や手法について、課題を出されたときに説明はありませんでしたか?
2. キマイラさんのC言語のスキルを教えてください。また習った文法や、使ってはいけないものなどがあれば教えてください。(使ってはいけないものがなければ数値計算ライブラリのようなものを探して使えばよいので)
3. 「変曲点」とは何か、「微分」という言葉を用いずに説明してください

キマイラ

Re: C言語 3次関数 変曲点

#4

投稿記事 by キマイラ » 9年前

いろいろ不足していました。
すみません


y=x3-3x2+4という式において、(変曲点が簡単なのでこの式で)
3次曲線上の任意の点をA(x,y)、変曲点の座標をB(p,q)とすると、
点Aの点Bに関する対称点C(r,s)は、
r=2p-x
s=2q-y
したがって、
2q-y=(2p-x)³-3(2p-x)²+4
2(p³-3p²+4)-(x³-3x²+4)=(2p-x)³-3(2p-x)²+4
これから、(p-1)(p²-2xp+x²)=0
p=1
代入してq=2
よって変曲点は(1,2)といった感じです。


私のC言語のスキルはほとんど初心者です。
習った文法はif文、for文、while文、配列くらいです。
できればこれらの文法でお願いしたいです。

アバター
ookami
記事: 214
登録日時: 13年前
住所: 東京都

Re: C言語 3次関数 変曲点

#5

投稿記事 by ookami » 9年前

キマイラさん、
まだ課題のシバリが見えないというか、
式が決まっていて、変曲点を「出力せよ」というだけなら、
極端な話、手計算で計算して、「printf("1,2");」でよくなってしまいます。(ある意味、高速化の一般的な手法です。答えが決まっているなら固定値で持たせるという。)
もちろんそんな課題ではないと思うので、例えば「係数はプログラムが起動してから入力する」だとか、課題自体にもっと条件があるのではと思うのですが。。。

キマイラ

Re: C言語 3次関数 変曲点

#6

投稿記事 by キマイラ » 9年前

与えられた式の変曲点をプログラム内で計算して
実行結果としてだすといった感じです。

実行結果は
「y=x3-3x2+4の変曲点を計算します。
変曲点は(1,2)です」
のようになればいいのてすが…

アバター
usao
記事: 1887
登録日時: 11年前

Re: C言語 3次関数 変曲点

#7

投稿記事 by usao » 9年前

単に
>y=4x^3+5x^2+6x+7
という 特定の式 についてのみ答えを出せばいいのか,

それとも

例えばプログラム実行時に,
y = ax^3 + bx^2 + cx + d
の係数{a,b,c,d}を入力したら,それに見合った答えを出す

という話なのか?
というようなことが問われているのだと思いますが,
それに対して その答え方だと どうにもどちらなのかはっきりしません.
前者ですか? 後者ですか? (それとも全く別?)

わざわざ謎の条件が付けられている時点で何かの課題なのだと思いますが,
だったら,課題の問題文があればそれを丸々書いてもらった方が課題内容が伝わるのではないでしょうか.

アバター
usao
記事: 1887
登録日時: 11年前

Re: C言語 3次関数 変曲点

#8

投稿記事 by usao » 9年前

で,おそらく後者なのだろうと思いますが,

>対象点...
という話は

y = f(x) = ax^3 + bx^2 + cx + d
の変曲点のx座標がpだとすると,何か適当なx座標 x0 に対して,
2f(p) = f(2p-x0) + f(x0)
が成り立つ.
これを展開して p についての関数 g(p)=0 の形にする→これを解けば変曲点が求まる

ということだと思います.
(x0の値が何でもよいなら,x0=0 としてしまえば楽なのか?)


プログラムとしては
g(p)=0 を解くコードを書けば良いのではないでしょうか.

コード:

int main()
{
  scanf()とかコマンドライン引数とか,何なのかわからないが{a,b,c,d}の値を得る処理
 p = 変曲点のx座標を求める関数( a,b,c,d );  //←g(p)=0を解く関数を実装する
  答えとしてpとf(p)を表示
  return 0;
}

アバター
ookami
記事: 214
登録日時: 13年前
住所: 東京都

Re: C言語 3次関数 変曲点

#9

投稿記事 by ookami » 9年前

キマイラさん、
「与えられた式の変曲点をプログラム内で計算」ということなら、
「どうやって与えられるか」が課題で示されているはずです。それを確認してください。

また、「微分は使ってはならない」のなら、どこまで使ってよいのでしょうか?
例えば、公式「変曲点P=(-b/(3a)、F(-b/(3a)))」は使ってよいのでしょうか?

(「これは微分がないと証明できないから使ってはならない」、ということなら、
上の手計算で前提にされている、「変曲点に対して点対象」というのも、たしか微分がないと証明できないので使ってはならない可能性があります。)

使ってよい、ということなら-b/(3a)を計算するだけなのでとっても簡単です。
(初心者向けの課題とのことなのでもうコレな気がしてきたのですが...)

課題の一部に「この知識は使ってはダメ」とあるので、「じゃあその知識に『関連する』知識はどこまでセーフなの?」というのが明確でないのです。

キマイラ

Re: C言語 3次関数 変曲点

#10

投稿記事 by キマイラ » 9年前

ookamiさん、usaoさん、
式はすでに与えられています。

書き方が分かれば数字を変えるだけなのでとりあえず
変曲点が簡単なy=x3-3x2+4での書き方を教えてください。
問題のまんまの式をかいてこれをみられたらまずいので…

また、変曲点の一般式にいれて解くのもだめです。
変曲点の性質を用いて解くよう指示を受けました。


>y = f(x) = ax^3 + bx^2 + cx + d
>の変曲点のx座標がpだとすると,何か適当なx座標 x0 に対して,
>2f(p) = f(2p-x0) + f(x0)
>が成り立つ.
>これを展開して p についての関数 g(p)=0 の形にする→これを解けば変曲点が求まる
ということでしたがこの式に当てはめても答えがでてきませんでした。


お手数をおかけして申し訳ないです。

アバター
ookami
記事: 214
登録日時: 13年前
住所: 東京都

Re: C言語 3次関数 変曲点

#11

投稿記事 by ookami » 9年前

キマイラさん、
公式は禁止でしたか...orz

そもそもなんですが、
「変曲点の性質を用いて解くように」とのことですが、
そもそも変曲点の定義は「二階微分がゼロになる点」なので、「変曲点の性質を用いる」というのは必ずどこかで微分を用いているわけです。

なので、
「変曲点の一般式にいれて解くのはだめ」、
「g(p)=0 ~ この式に当てはめても答えがでてきません」
となると、変曲点を求める方法がないのではないかと思うのですが。。。 本当に課題に他の情報がないのでしょうか?

一般式なら「直接的には微分を使っていないので課題的にはセーフなのかな」と思ったのですが...
念のため:イジワルしているわけではなくて、そのシバリでは本当にプログラムできないんじゃないかと思っています。

(もしかして微小な区分で傾きを走査する?とも思いましたが、それも考え方は微分ですし... むしろ誤差も出るし、初心者向けの課題でそれもない気がして。)



また、「式はすでに与えられています。」とのことですが、プログラムは「すでに与えられている式」というモノを勝手には解釈してくれません。「y=x^3-3x^2+4」というのは、人間は式として認識できますが、プログラムから見れば文字列であって、「式」ではないのです。
なので、必ず「どうやって、何が、何の型で」与えられるかが分からないとプログラムできません。
「標準入力から、係数が、文字列で」与えられるのでしょうか?というかそれがあいまいなら課題の出し方がおかしいと思います。

アバター
usao
記事: 1887
登録日時: 11年前

Re: C言語 3次関数 変曲点

#12

投稿記事 by usao » 9年前

質問者様のこれまでの説明からだけでは
正直,出題者がどういう方法での開放解法を求めているのかが
我々の側(私だけ?)には不明です.

>g(p)=0
ではない
>変曲点の性質
って具体的にどんなことを指すのでしょう?


先にも書きましたが,何らかの課題の文面などを提示できないのでしょうか?
あるいは どんな{分野,授業,講義,…}の課題なのか? とかいう背景的なヒントとか…


>(もしかして微小な区分で傾きを走査する?とも思いましたが、それも考え方は微分ですし...
微分を使ってはいけないという条件というのは,解析的な導関数を用いるな,という意味なのかと思うので,
数値微分とかを行う分には良いんじゃないかなぁ? さすがに…
オフトピック
y = f(x) = ax^3 + bx^2 + cx + d
に対して,逆関数
x = F(y)
を考えたときに,yに対するxが3つあるようなyの範囲内において,
三つのxの値{x1,x2,x3}が等間隔に並ぶようなyを見つければいい…とか?

私は数学ダメなので,そんなことがどうやればできるのかわかりませんし,
結局 g(p)=0 と同じことを言ってるだけなのかもしれませんけど.

アバター
usao
記事: 1887
登録日時: 11年前

Re: C言語 3次関数 変曲点

#13

投稿記事 by usao » 9年前

オフトピック
あー,もう,あれだ.

コード:

    2           5
┌─┳─┬─┬─┓
│  │  │3 │  │
├─┼─╋─┼─┤
│  │  │  │  │
┗─┴─┴─┻─┘
 1           4
みたいなグリッド上の5点 { P[1]=(X[1],Y[1]), P[2]=(X[2],Y[2]),...,P[5]=(略) } を考えて,
これらの点の座標を, どれかの点の座標(例えばP[3])と格子の縦横サイズW,H の4つのパラメタで表して,
与えられた数式 y = f(x) に対して この点群を当てはめる(P[3]が変曲点に,その他の点も y=f(x)上に乗るようにする)ための
最小二乗評価関数を
 Σ_i{ ( Y - f(X) )^2 }
とした最小化問題にでもすればどうですかね.
で,これを解く際に f(x)の微分を用いないタイプの数値計算方法 を使えば良い,と.
(パラメタ初期値の問題がある&得られる答えは近似値だけど.)

たいちう
記事: 418
登録日時: 13年前

Re: C言語 3次関数 変曲点

#14

投稿記事 by たいちう » 9年前

フィルタ越しに出題者の意図を予想してみました。


グラフが上に凸か下に凸かを調べてはどうでしょう。
切り替わるところが変曲点なので、十分広い範囲から初めて、
2分探索でx座標を求めます。

任意の(x, f(x))について、どっちに凸かは、
f(x-δ)とf(x+δ)の平均とf(x)を比較することで判定します。

閉鎖

“C言語何でも質問掲示板” へ戻る