বহুবর্ষের আসল শেকড় সন্ধান করুন


24

একটি স্ব-অন্তর্নিহিত প্রোগ্রাম লিখুন যা একটি বহুপদী এবং একটি সীমা দেওয়া হলে সেই বহুত্বের সমস্ত আসল শিকড় সীমা অতিক্রম না করে একটি পরম ত্রুটির সাথে খুঁজে পায়।

সীমাবদ্ধতাসমূহ

আমি জানি যে ম্যাথমেটিকা ​​এবং সম্ভবত কিছু অন্যান্য ভাষার একটি এক-প্রতীক সমাধান রয়েছে এবং এটি বিরক্তিকর, সুতরাং আপনার আদিম ক্রিয়াকলাপগুলিকে আটকে রাখা উচিত (সংযোজন, বিয়োগফল, গুণ, বিভাগ)।

ইনপুট এবং আউটপুট ফর্ম্যাটে কিছুটা নমনীয়তা রয়েছে। আপনি স্ট্যান্ডিন বা কমান্ড-লাইন আর্গুমেন্টের মাধ্যমে কোনও যুক্তিসঙ্গত বিন্যাসে ইনপুট নিতে পারেন। আপনি ভাসমান পয়েন্টের অনুমতি দিতে পারেন বা যুক্তি সংখ্যার কিছু উপস্থাপনা ব্যবহার করার প্রয়োজন হতে পারে। আপনি বাউন্ডের বাউন্ডের রেসিড্রোকাল নিতে পারেন এবং আপনি যদি ভাসমান বিন্দু ব্যবহার করছেন তবে আপনি ধরে নিতে পারেন যে এই গণ্ডিটি 2 টি উলপ এর চেয়ে কম হবে না। বহুবর্ষটি মনোমণ্ডল সহগের তালিকা হিসাবে প্রকাশ করা উচিত, তবে এটি বড়- বা সামান্য-এডিয়ান হতে পারে।

আপনার প্রোগ্রামটি সর্বদা কেন কাজ করবে তা আপনাকে ন্যায়সঙ্গত করতে সক্ষম হতে হবে (মডুলো সংখ্যাসূচক সমস্যাগুলি), যদিও এটির জন্য সম্পূর্ণ প্রমাণ সরবরাহ করার প্রয়োজন নেই।

প্রোগ্রামটি অবশ্যই পুনরাবৃত্ত শিকড়গুলির সাথে বহুবচনগুলি পরিচালনা করবে।

উদাহরণ

x^2 - 2 = 0 (error bound 0.01)

ইনপুট যেমন হতে পারে

-2 0 1 0.01
100 1 0 -2
1/100 ; x^2-2

আউটপুট যেমন হতে পারে

-1.41 1.42

কিন্তু না

-1.40 1.40

যে হিসাবে প্রায় 0.014 এর সম্পূর্ণ ত্রুটি আছে ...

পরীক্ষার মামলা

সরল:

x^2 - 2 = 0 (error bound 0.01)

x^4 + 0.81 x^2 - 0.47 x + 0.06 (error bound 10^-6)

একাধিক মূল:

x^4 - 8 x^3 + 18 x^2 - 27 (error bound 10^-6)

উইলকিনসনের বহুতল:

x^20 - 210 x^19 + 20615 x^18 - 1256850 x^17 + 53327946 x^16 -1672280820 x^15 +
    40171771630 x^14 - 756111184500 x^13 + 11310276995381 x^12 - 135585182899530 x^11 +
    1307535010540395 x^10 - 10142299865511450 x^9 + 63030812099294896 x^8 -
    311333643161390640 x^7 + 1206647803780373360 x^6 -3599979517947607200 x^5 +
    8037811822645051776 x^4 - 12870931245150988800 x^3 + 13803759753640704000 x^2 -
    8752948036761600000 x + 2432902008176640000  (error bound 2^-32)

এনবি এই প্রশ্নটি স্যান্ডবক্সে প্রায় 3 মাস ধরে ছিল। আপনি যদি মনে করেন পোস্ট করার আগে এটির উন্নতি প্রয়োজন, স্যান্ডবক্সে যান এবং অন্য প্রস্তাবিত প্রশ্নগুলি মেইনে পোস্ট করার আগে তাদের মন্তব্য করুন



@ বিলেসারিয়াস, ??
পিটার টেলর

3
কৌতুক হিসাবে উদ্দেশ্য ছিল :(
ডঃ বেলিসারিয়াস

আমি জানি এটি একটি পুরানো চ্যালেঞ্জ, সুতরাং যদি আপনি এটি আবার চালু করার মতো মনে করেন না তবে উত্তর দিতে বাধ্য বোধ করবেন না। (ক) আমরা কি কোনও ফাংশন লিখতে পারি, বা কেবল একটি সম্পূর্ণ প্রোগ্রাম? (খ) আমরা কোনও ফাংশন লিখতে পারলে, আমরা কি ধরে নিতে পারি যে ইনপুটটি কিছু সুবিধাজনক ডেটা টাইপ ব্যবহার করে, যেমন, পাইথনের fractions.Fraction(যুক্তিযুক্ত ধরণের)? (গ) আমাদের কি ডিগ্রি <1 এর বহুপদী পরিচালনা করতে হবে? (d) আমরা কি ধরে নিতে পারি যে অগ্রণী সহগ 1?
Ell

(ঙ) পুনরাবৃত্ত শিকড়গুলির সাথে বহুবচন সম্পর্কে, এটি বিজোড় এবং এমনকি বহুগুণের শিকড়গুলির মধ্যে পার্থক্য রাখাই মূল্যবান (পরীক্ষার ক্ষেত্রে কেবল বিজোড় গুণগুলির শিকড় থাকে)) যদিও বিজোড় গুণটির শিকড়গুলি মোকাবেলা করা খুব কঠিন নয়, আমি ' আমি নিশ্চিত নই যে সংখ্যার দিক থেকে এমনকি বহুগুণের শিকড়গুলি সঠিকভাবে পরিচালনা করা কতটা স্পষ্টতই বিশেষত যেহেতু আপনি কেবল শিকড়ের মানগুলির জন্য একটি ত্রুটি মার্জিন নির্দিষ্ট করেন, তাদের অস্তিত্বের জন্য নয়। (...)
Ell

উত্তর:


8

গণিত, 223

r[p_,t_]:=Module[{l},l=Exponent[p[x],x];Re@Select[NestWhile[Table[#[[i]]-p[#[[i]]]/Product[If[i!=j,#[[i]]-#[[j]],1],{j,l}],{i,l}]&,Table[(0.9+0.1*I)^i,{i,l}],2*Max[Table[Abs[#1[[i]]-#2[[i]]],{i,l}]]>t&,2],Abs[Im[#]]<t^.5&]]

এই সমাধানটি বহুত্বগুলি সমাধানের জন্য ডুরান্ড – কার্নার পদ্ধতিটি কার্যকর করে। মনে রাখবেন যে এটি সম্পূর্ণ সমাধান নয় (নীচে প্রদর্শিত হবে) কারণ আমি এখনও উইলকিনসনের বহুবর্ষকে নির্দিষ্ট নির্ভুলতার সাথে পরিচালনা করতে পারি না। প্রথমে আমি কী করছি তার একটি ব্যাখ্যা: গণিত বিন্যাসে কোড

#[[i]]-p[#[[i]]]/Product[If[i!=j,#[[i]]-#[[j]],1],{j,l}]&: সুতরাং প্রতিটি সূচকের iজন্য পরবর্তী ডুরান্ড-কার্নার আনুমানিকের জন্য ফাংশন গণনাগুলি । তারপরে এই লাইনটি একটি সারণীতে আবদ্ধ করা হয় এবং দ্বারা উত্পন্ন ইনপুট পয়েন্টগুলিতে নেস্টওয়াইল ব্যবহার করে প্রয়োগ করা হয় Table[(0.9+0.1*I)^i,{i,l}]। নেস্টওহিলের শর্তটি হ'ল এক পুনরাবৃত্তি থেকে পরের দিকে সর্বাধিক পরিবর্তন (সমস্ত শর্তের উপরে) নির্দিষ্ট নির্ভুলতার চেয়ে বেশি। সমস্ত পদ যখন এর চেয়ে কম পরিবর্তিত হয়েছে, নেস্টওয়াইল শেষ Re@Selectহয়ে যায় এবং আসল লাইনে পড়ে না এমন শূন্যগুলি সরিয়ে দেয়।

উদাহরণ আউটপুট:

> p[x_] := x^2 - 2
> r[p, .01]
{1.41421, -1.41421}

> p[x_] := x^4 - 8 x^3 + 18 x^2 - 27
> r[p, 10^-6]
{2.99999, 3., 3.00001, -1.}

> p[x_] := x^20 - 210 x^19 + ... + 2432902008176640000 (Wilkinson's)
> Sort[r[p, 2^-32]]
{1., 2., 3., 4., 5., 6., 7.00001, 7.99994, 9.00018, 10.0002, 11.0007, \
11.9809, 13.0043, 14.0227, 14.9878, 16.0158, 16.9959, 17.9992, \
19.0001, 20.}

আপনি সম্ভবত দেখতে পাচ্ছেন, যখন ডিগ্রি বেশি বৃদ্ধি পায় তখন এই পদ্ধতিটি সঠিক মানগুলির চারপাশে বাউন্স শুরু করে, সত্যিকার অর্থে কখনই পুরোপুরি অভ্যন্তরীণ হয় না। যদি আমি আমার কোডটির স্টপিং শর্তটিকে "এক পুনরাবৃত্তির থেকে পরবর্তী অনুমানগুলি এপসিলনের চেয়ে কোনও পরিবর্তন করে" এর চেয়ে আরও কঠোর কিছু হিসাবে সেট করি তবে অ্যালগরিদম কখনই থামে না। আমার ধারণা, নিউটনের পদ্ধতির ইনপুট হিসাবে আমার কেবল ডুরান্ড-কার্নার ব্যবহার করা উচিত?


ডুরান্ড-কার্নারের একাধিক শিকড় নিয়েও সম্ভাব্য সমস্যা রয়েছে। (নিউটনের পদ্ধতিটি খুব বেশি উপকারে আসতে পারে না - উইলকিনসনের বহুভুজটি বিশেষত অসুস্থ হওয়ার জন্য বেছে নেওয়া হয়েছে)।
পিটার টেলর

আপনি একদম সঠিক: উইলকিনসনের কাছাকাছি x = 17 এ জুম করার পরে আমি সেই ক্রিয়াটি বাতিল করে দিয়েছিলাম, এটি এক চূড়ান্ত গোলযোগ। আমি চিন্তিত যে আরও অনেক নির্ভুলতা পেতে আমাকে গ্রোবনার ভিত্তিতে একটি প্রতীকী সমাধান করতে হবে।
কেয়া
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.