برنامه‌ای به زبان C++ بنویسید که انتگرال عددی تابع f(x)=sin(x) را روی بازه [a,b] با روش ذوزنقه‌ای و با تقسیم‌بندی n قسمت مساوی محاسبه کرده و مقدار حاصل را چاپ کند.

13.0 بازدید آخرین ویرایش در 198 روز قبل ساعت 01:03

0.0

برای حل، فاصله h = (b-a)/n را محاسبه کنید، سپس جمع ابتدایی و انتهایی را به ترتیب (f(a)+f(b))/2 در نظر گرفته و برای هر نقطه داخلی i از 1 تا n-1 مقدار f(a+i*h) را جمع کنید؛ در انتها حاصل‌ضرب جمع در h برابر با مقدار تقریبی انتگرال است. از نوع double برای دقت بهتر و از برای توابع مثل sin استفاده کنید؛ برای n بزرگ می‌توانید با فعال‌سازی OpenMP (یا تقسیم کار با std::thread) حلقه جمع را موازی کنید و توجه داشته باشید که همگام‌سازی جمع تجمعی در حالت موازی اهمیت دارد (مثلاً با reduction در OpenMP).

توسط پژوهشگر در 198 روز قبل ساعت 01:03
دسته بندی ها: C Plus Plus C Plus Plus for beginner
arash در 198 روز قبل ساعت 01:04

برای دقت بهتر در پیاده‌سازی ذوزنقه‌ای در C++ از نوع double و تابع sin از <cmath> استفاده کنید و مطمئن شوید که آرگومان‌ها بر حسب رادیان هستند و n>0 باشد (در صورت معکوس بودن بازه می‌توانید a و b را جابه‌جا کنید). هنگام جمع‌زدن تعداد زیادی ترم برای n بزرگ، خطای تجمعی ممکن است افزایش یابد؛ می‌توانید از جمع Kahan یا long double برای کاهش خطا بهره ببرید. اگر می‌خواهید حلقه‌ی جمع را موازی کنید، از pragma reduction در OpenMP یا قفل/جمع محلی در std::thread استفاده کنید تا شرایط رقابتی حذف شود. در خروجی نیز با std::setprecision مقدار مناسب اعشار را تنظیم کنید تا نمایش نتیجه خواناتر شود.

گزارش

1 پاسخ

جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من

در حال بارگیری...
ورود به حساب کاربری