No.3ベストアンサー
- 回答日時:
一変数多項式のみで考えてよいならば
一変数多項式を係数の配列で表しましょう
double a[] = { 1, 3, 5 }; // x^2+3x+5
一変数多項式同士の乗算は
double r[] = { 0, ... };
for(i=0;...) for(j=0;...) r[i+j] += a[i] * b[j];
累乗は、乗算の繰り返し
形式微分は、各係数に次数を乗算して、配列末尾を削除
不定積分は、各係数に次数を除算して、配列末尾にC(に該当する値)を追加
最後に、配列を多項式風に文字列表示する機能を作れば、
ご質問の内容は実装できると思います。
No.5
- 回答日時:
> いつもいつも有り難うございます。
いやいや。
でだ。
「一般化」するのかあるいは「仕様を狭めて」「この問題を解くだけでいいのか」とか言うのは自分で決めないといけない、って事だね、いずれにせよ。
例えば、#3氏がやってるのは#3氏が貴方が出した問題を読んで「仕様を狭めてくれた」って事。まあある意味ハックで、この問題に限定したやり方だとこういうやり方があるよ、って紹介だな。僕もある意味、実現可能性な範疇って言う意味では賛成です(u^4を展開するのが厄介だが)。
でも貴方がどう考えてるかは知らん。そんなトコだ。
逆に#4氏の案。これ実は滅茶苦茶正しいのよ。
#4氏の言ってる案ってのは事実上
「C言語で新しいプログラミング言語を造っちゃえば?」
って言うのと等価な事を実は言ってる。1で入力された数式を字句解析と構文解析して・・・って流れは「プログラミング言語を作れ」って言ってるのと等価です。
そして2番。No.4氏が言ってる、
2)データ構造に微分の公式(例えば(x^n→n*x^(n-1))を適宜適用して新たなデータ構造を構築する導出部。
これをパターンマッチングと呼ぶ。プログラミング言語によってはこの機能を搭載してるプログラミング言語があるんだけど、生憎C言語には無い。
でも「C言語で新しいプログラミング言語を作る」のならこの機能を乗せちゃえばいいだろ、って事なんだよな。
要するに、仮にこれをインタプリタだとすると、このパターンマッチングを評価部として実装しろ、ってのを#4氏は言ってるわけ。
残りは出力なんで、3)はそのままだな。
つまり、#2で紹介したMaximaと言うソフトの「簡易版造ってみれば?」ってのが#4氏の提案の意味してるトコだ。
これはこれで正しい提案です。
まぁ、プログラミング言語を実装してみたい、とか実装してみた事がある、ってのなら魅力的な案ではあるよね。
いずれにせよ。
どっちの戦略取るにせよ貴方次第だし、前者(#3氏)の方針は「この問題を解くだけなら有効」なんだけど、一般性はない。一方#4氏の方針は#3氏の方針より一般性はあるんだけど、簡易的たぁ言え「プログラミング言語を自作しなさい」って言ってるのとほぼ同義なので、それなりに専門知識を要するし、やっぱ先に「プログラミング言語作成に関する」専門書籍を読んだ方がエエんちゃうの?って話になってます。
No.4
- 回答日時:
1)入力した式を解析して、適切なデータ構造を構築するパーサ部。
2)データ構造に微分の公式(例えば(x^n→n*x^(n-1))を適宜適用して新たなデータ構造を構築する導出部。
3)最終的なデータ構造から、読める形に式を出力するプリント部。
――みたいな感じで。※役立つレベルのプログラムじゃないですが。
>どのような原理で積分されるのか
一般的な積分公式や特殊解法を適宜適用するというノウハウが必要(=万能なアルゴリズムがまだない。)と、昔聞いたことがあったような。まあ、結構積分計算を行うWebサイトとかあるので、いろいろはかどってるのでしょうが。
参考:(x^2 +3x+1)^4を積分
https://www.integralrechner.de/#expr=%28x%5E2%20 …
https://mathsolver.microsoft.com/ja/solve-proble …
No.2
- 回答日時:
> y=(x^2 +3x+1)^4を微分の定義を用いて微分するプログラムの作り方を教えて下さい!
分からん。
っつーか仕様が不十分。
こんなんじゃプログラムに「ならない」ってのはプログラミングを少しでも勉強してれば分かりそうなモノなんだけど。
これじゃあ「ど素人」の宿題丸投げだ。
やっぱ「ど素人」なの?
そもそも「微分の定義」って何?
これか?
lim_{h->0}(((f(a+h)-f(a))/h)
これをプログラミングするの?
例えばhを「限りなく0に近づける」と言うのが微分の定義なんだけど。
これをどうやって実装するつもり?
手元のCコンパイラのfloat.h辺りを使って調べて欲しいんだけど。
恐らくfloat型やらdouble型の0より大きい数での最小値は
2.225074e-308
とかそこらの数だ(要確認)。
hにこれを入れる?
確かに小さな数だろう。が「限りなく0に近づいた数」かと言えば・・・答えはNoだろう。人によってはenoughだと判断するかもしれんが。
いずれにせよまずは、「微分の定義」が一体何を指してるんだかサッパリ分からん。
なおかつ
「限りなく0に近づいた数」は数学の抽象性としてはOKの表現だが、「具体」を対象とするプログラミングに持ち込む表現としては全く失格である。
つまり、「こんなモンはプログラミング不可能である」と言うのが一つの側からの答えである。
もう一つの側からの答えも「(殆ど)不可能」である。
例えばC言語で電卓的なプログラムをやるのは可能だろう。
例えば
printf(1 + 2);
みたいなカンジでな。答えは3だと言うのはすぐ分かる。
ところがこういうプログラムは極めて難しい。殆ど出来ない、と言って良い。
printf(x + y);
xとyに何か数が代入されていればこれはコンパイルは通るし、「実値」として何らかの数を印字してくれるだろう。
ただし、「貴方が本当にx + yをそのまま印字して欲しい」と思ってたらそれは上手く行かない。
じゃあこれならどうか。
printf("x + y");
これは文字列を印字してるんであって、数式を印字してるわけじゃあないんだな。
これで分かる事は。C言語に限らず。殆どのプログラミング言語では数値の式は扱えるけど「方程式は扱えない」と言う事だ。そう、プログラミング言語には方程式を扱う枠組みが通常存在しない。
だから「完全に無理だ」とは言わないけど、
x^2+3*x+1)^4
を微分して
4*(2*x+3)*(x^2+3*x+1)^3
と言う「方程式」を得るのはほぼ不可能なのだ。無理と言って良い。
これ、何で大学に入ってC言語の授業取って、ニュートン法とか言うワケの分からん事を学んでるのか、ぶっちゃけると理由はこれなんだな。「C言語では方程式を扱うのがほぼ無理だから」。だから代わりに「実値で解析する」って事をやるハメになる。
これは数学得意な人だったらほぼ100%「なんでこんな事習わなアカンの?」ってなるんだよ。逆に言うと、数学得意な人じゃないヤツはニュートン法をやる事に抵抗がないの。
冷静に考えてみると、微分って超強力な技法を筆算でやれるヤツは「なんでこんなに繰り返し計算しつつ代入していかなアカンねん」ってなるんだよな。目的が無いと、彼らにとってはサッパリ意味が分からん事をやらされている。逆に、数学が不得手なヤツはむしろそんな事疑問にさえ思わないんだ。
んでハッキリ言うと、このテの授業は、確かにテクニカルな事を教えてはいるんだけど、もっと大きな事を隠してる。
それはさっきも書いた通り「実は殆どのプログラミング言語は方程式を扱うようには作られてない」と言う事実から目を逸らさせる為なんだ(笑)。言い換えると、コンピュータは、実は「方程式を解くようには作られていない」ってこった。
考えてみると、我々が普通、数学で一番欲しいのは方程式を解く能力で、中学校辺りから筆算で一番頑張ってきたのは「文字式を解く」事なんだけど、コンピュータは実は文字式を解く事が出来ない。っつーか苦手なんだな。
つまり、「コンピュータは計算は出来る」んだけど、「数学が出来ない」事が実はこの辺で発覚するんだけど、発覚しちまえば学生がやる気無くしちまうんで(笑)、この辺の事実から目をそらさせようとする。
もう一回言う。コンピュータは実値計算が得意なのは事実である。我々は計算速度で言うとコンピュータに勝てない。
ただしだ、事実上、コンピュータは数学が出来ない。言い換えると彼らは「数学」って意味で言うとそこらの中学生にも勝てないんだ。つまり、「やたら算数の計算が速い小学生」、それがコンピュータの正体だ。しかしこいつらに数学を「教える」のは相当厄介なのである。
果たして「やたら算数の計算が速い小学生」であるコンピュータに「数学をさせる」のは可能なんだろうか?実はこの分野を「記号演算」とか「記号処理」等と呼ぶ。古典的な範疇だと実は人工知能の範疇なんだよな。
そして「記号演算」とか「記号処理」と言う分野は実はC言語をはじめとする殆どのプログラミング言語にとっては「苦手な分野」なんだ。このテの処理をさせるのはある意味特殊な範疇のプログラミング言語を要する。
C言語で「完全に無理」たぁ言わない。でも殆ど不可能だろう。ましてや教えて!gooで気軽に投稿して答えをもらえるような範疇のトピックではない。キチンと専門書を買って勉強しろ、って分野だ。微分に関しても「記号微分」と言う分野の話になる。
この「記号演算」「記号処理」「記号微分」等の古典的な人工知能研究の成果がフリーソフトで公開されている。Maximaと言うソフトウェアだ。
Maxima:
https://maxima.sourceforge.io/
もちろんこのソフトはCでは書かれていない。
がMIT(マサチューセッツ工科大学)の古典的な人工知能の研究成果が詰まってるソフトである。
オープンソースなんで、気になるなら中身を調べてみれば良いだろう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 数学 【完全微分方程式⠀】 分数で分母が0になり定義できない場合、分母を仮にtと置いてそれを極限t→0とし 1 2022/05/06 14:43
- 数学 微分について教えてください 放物線y=x^2のx=1における微分係数を定義に従って求め、その点におけ 5 2023/04/16 15:38
- 数学 (1+x^2)y'=1 の微分で教えて下さい 2 2022/08/30 10:23
- 数学 関数1/(1+√x)のx=1における微分係数を微分の定義に従って求めよ。 これについて教えていただき 5 2023/07/22 19:08
- 数学 テーマ82のy‘’のところの式なんですけど−2を取り出して中だけ微分してるんですがなんでそれができる 4 2022/05/14 02:44
- 数学 190(1)なんですけどx≧0の時を考える時、いちいちx>0において微分という形ですが別にx≧0にお 3 2022/06/12 04:34
- 数学 次の関数を微分せよ y=sin^4 x cos^4 x という問題で自分は積の微分法で微分して y' 3 2023/05/17 20:38
- 数学 微分積分の極限についての問題がわからないです。 1 2023/01/08 13:57
- 数学 関数の極値と微分係数の関係について 6 2023/04/23 14:35
- 数学 微分積分の接線についての問題がわからないです。 2 2023/01/08 13:54
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
排他的論理和 BCC(水平パリテ...
-
EXCELなどで「返す」という表現
-
65536は2の何乗なのでしょうか?
-
バッチファイルでウインドウを...
-
CCurの引値を文字列にする時と...
-
CRCについて教えてください
-
Visual C++でdebugとreleaseで...
-
C言語についてです。 再帰を使...
-
モジュラス103の計算とは何でし...
-
Java 電卓の連続計算
-
VBAで関数をつくる
-
エクセルで特定のセルのみを任...
-
0x0000ffffLの"L"って・・・
-
めちゃきれい
-
Scilabでfor文を使用しないで記...
-
パソコン
-
PHPで四則演算以外の微分、積分...
-
入射角反射角
-
VBとVBAの違い
-
駅間の距離を求め運賃計算するJ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
変化させるセルが変化しない
-
排他的論理和 BCC(水平パリテ...
-
VBAの再計算が反映されない件に...
-
VBAで関数をつくる
-
バッチファイルでウインドウを...
-
モジュラス103の計算とは何でし...
-
EXCELなどで「返す」という表現
-
数値計算の高速化 (cos, sin, exp)
-
傾いた四角形内の範囲の条件式
-
骨折リスク評価のFRAXについて...
-
matlab計算での進捗状況を知りたい
-
Excel VBAにてFFT
-
C言語についてです。 再帰を使...
-
C言語について 下の画像は do-w...
-
アドオン利率を実質年率に変換
-
エクセルで特定のセルのみを任...
-
電卓でmodの計算
-
引き放し法による除算アルゴリ...
-
y=(x^2 +3x+1)^4を微分の定義を...
おすすめ情報