プロが教えるわが家の防犯対策術!

y=(x^2 +3x+1)^4を微分の定義を用いて微分するプログラムの作り方を教えて下さい!
また、y=(x^2 +3x+1)^4を積分するプログラムもお願い致します。積分には微分の定義のような公式がないため、どのような原理で積分されるのか気になります。
言語はcです。

教えて!goo グレード

A 回答 (5件)

一変数多項式のみで考えてよいならば



一変数多項式を係数の配列で表しましょう
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(に該当する値)を追加

最後に、配列を多項式風に文字列表示する機能を作れば、
ご質問の内容は実装できると思います。
    • good
    • 0

> いつもいつも有り難うございます。



いやいや。

でだ。
「一般化」するのかあるいは「仕様を狭めて」「この問題を解くだけでいいのか」とか言うのは自分で決めないといけない、って事だね、いずれにせよ。
例えば、#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氏の方針より一般性はあるんだけど、簡易的たぁ言え「プログラミング言語を自作しなさい」って言ってるのとほぼ同義なので、それなりに専門知識を要するし、やっぱ先に「プログラミング言語作成に関する」専門書籍を読んだ方がエエんちゃうの?って話になってます。
    • good
    • 1

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 …
    • good
    • 1

> 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(マサチューセッツ工科大学)の古典的な人工知能の研究成果が詰まってるソフトである。
オープンソースなんで、気になるなら中身を調べてみれば良いだろう。
「y=(x^2 +3x+1)^4を微分の定」の回答画像2
    • good
    • 0
この回答へのお礼

いつもいつも有り難うございます。

お礼日時:2021/08/11 22:11

無理だね. あきらめて.

    • good
    • 2

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

教えて!goo グレード

このカテゴリの人気Q&Aランキング