যদি আপনি আপনার রাউন্ডিং ত্রুটির জন্য একটি ভাল বাউন্ডের সন্ধান করে থাকেন তবে আপনার অগত্যা একটি অ্যাব্রিট্রি-স্পষ্টতা গ্রন্থাগারের প্রয়োজন নেই। পরিবর্তে আপনি চলমান ত্রুটি বিশ্লেষণ ব্যবহার করতে পারেন।
আমি কোনও ভাল অনলাইন রেফারেন্স খুঁজে পাইনি, তবে নিক হিহামের বই "নির্ভুলতা এবং সংখ্যার অ্যালগরিদমের স্থায়িত্ব" বইয়ের ৩.৩ অনুচ্ছেদে এটি সমস্ত বর্ণিত হয়েছে। ধারণাটি বেশ সহজ:
- আপনার কোডটিকে পুনরায় ফ্যাক্টর করুন যাতে আপনার প্রতিটি লাইনে একটি একক পাটিগণিত ক্রিয়াকলাপ থাকে।
- প্রতিটি ভেরিয়েবলের জন্য, উদাহরণস্বরূপ
x, একটি ভেরিয়েবল তৈরি করুন x_errযা xধ্রুবক হিসাবে নির্ধারিত হলে শূন্য থেকে শুরু করা হয় ।
- প্রতিটি অপারেশনের জন্য, উদাহরণস্বরূপ
z = x * y, z_errভাসমান-বিন্দুর পাটিগণিতের মানক মডেল এবং ফলস্বরূপ zএবং চলমান ত্রুটিগুলি x_errএবং ব্যবহার করে চলকটি আপডেট করুন y_err।
- আপনার ফাংশনের রিটার্ন মানটির
_errসাথে এটির সাথে একটি সম্পর্কিত মানও যুক্ত হওয়া উচিত। এটি আপনার সম্পূর্ণ রাউন্ডঅফ ত্রুটির উপর নির্ভরশীল একটি ডেটা-নির্ভর।
জটিল অংশটি হল পদক্ষেপ ৩. সর্বাধিক সাধারণ গাণিতিক ক্রিয়াকলাপগুলির জন্য, আপনি নিম্নলিখিত বিধিগুলি ব্যবহার করতে পারেন:
z = x + y -> z_err = u*abs(z) + x_err + y_err
z = x - y -> z_err = u*abs(z) + x_err + y_err
z = x * y -> z_err = u*abs(z) + x_err*abs(y) + y_err*abs(x)
z = x / y -> z_err = u*abs(z) + (x_err*abs(y) + y_err*abs(x))/y^2
z = sqrt(x) -> z_err = u*abs(z) + x_err/(2*abs(z))
u = eps/2ইউনিট রাউন্ডঅফ কোথায় হ্যাঁ, বিধি প্রণয়ন করিতে +এবং -একই। op(x)ফলাফল প্রয়োগের টেলর সিরিজের সম্প্রসারণটি ব্যবহার করে অন্য কোনও ক্রিয়াকলাপের নিয়মগুলি সহজেই বের করা যায় op(x + x_err)। অথবা আপনি গুগল করার চেষ্টা করতে পারেন। বা নিক হিগামের বইটি ব্যবহার করছে।
উদাহরণস্বরূপ, নিম্নলিখিত মতলব / অক্টাভ কোডটি বিবেচনা করুন যা হর্নার স্কিম ব্যবহার করে aএকটি নির্দিষ্ট সময়ে সহগের একটি বহুভুজকে মূল্যায়ন xকরে:
function s = horner ( a , x )
s = a(end);
for k=length(a)-1:-1:1
s = a(k) + x*s;
end
প্রথম পদক্ষেপের জন্য, আমরা দুটি অপারেশনগুলিকে এতে বিভক্ত করব s = a(k) + x*s:
function s = horner ( a , x )
s = a(end);
for k=length(a)-1:-1:1
z = x*s;
s = a(k) + z;
end
তারপরে আমরা _errভেরিয়েবলগুলি প্রবর্তন করি । নোট ইনপুট aএবং xঅধিকৃত হয় সঠিক হবে, কিন্তু আমরা ঠিক যেমন ভাল ব্যবহারকারীর জন্য সংশ্লিষ্ট মান পাস করার প্রয়োজন হতে পারে a_errএবং x_err:
function [ s , s_err ] = horner ( a , x )
s = a(end);
s_err = 0;
for k=length(a)-1:-1:1
z = x*s;
z_err = ...;
s = a(k) + z;
s_err = ...;
end
শেষ অবধি, ত্রুটির শর্তাদি পাওয়ার জন্য আমরা উপরে বর্ণিত বিধিগুলি প্রয়োগ করি:
function [ s , s_err ] = horner ( a , x )
u = eps/2;
s = a(end);
s_err = 0;
for k=length(a)-1:-1:1
z = x*s;
z_err = u*abs(z) + s_err*abs(x);
s = a(k) + z;
s_err = u*abs(s) + z_err;
end
নোট করুন যেহেতু আমাদের কোনও a_errবা নেই x_err, যেমন সেগুলি শূন্য বলে ধরে নেওয়া হয়, তত্ক্ষণাত ত্রুটি প্রকাশের ক্ষেত্রে সংশ্লিষ্ট পদগুলি এড়ানো হবে।
এট ভয়েইল! আমাদের কাছে এখন হর্নার স্কিম যা ফলাফলের পাশাপাশি একটি ডেটা-নির্ভর ত্রুটি অনুমান দেয় (দ্রষ্টব্য: এটি ত্রুটির উপরের একটি আবদ্ধ )।
পার্শ্ব দ্রষ্টব্য হিসাবে, যেহেতু আপনি সি ++ ব্যবহার করছেন, আপনি ভাসমান-পয়েন্ট মানগুলির জন্য নিজের শ্রেণি তৈরি করার কথা বিবেচনা করতে পারেন যা _errশব্দটি চারপাশে বহন করে এবং উপরে বর্ণিত মানগুলি আপডেট করার জন্য সমস্ত গাণিতিক ক্রিয়াকে ওভারলোড করে। বৃহত কোডগুলির জন্য, এটি গণনাগতভাবে কম দক্ষ, রুট হলেও সহজ হতে পারে। এটি বলার পরে, আপনি এই জাতীয় ক্লাসটি অনলাইনে খুঁজে পেতে সক্ষম হতে পারেন। একটি দ্রুত গুগল অনুসন্ধান আমাকে এই লিঙ্কটি দিয়েছে ।
± তোমার দর্শন লগ করাx ( 1 ± u )