یک برنامه C++ بنویسید که با روش مونتکارلو و استفاده از مولد تصادفی std::mt19937 مقدار انتگرال تابع f(x)=sin(x*x) را روی بازه [0,1] با N نمونه تصادفی تقریب بزند و مقدار تقریبی انتگرال، برآورد خطای تقریبی (انحراف معیار نمونه تقسیم بر sqrt(N)) و زمان اجرای محاسبه را چاپ کند.
8.0 بازدید آخرین ویرایش در 221 روز قبل ساعت 01:15 0.0
برای حل، از هدرهای برای تولید نمونههای یکنواخت در [0,1]، برای محاسبه تابع، و برای اندازهگیری زمان استفاده کنید. برای محاسبه سریع و کمحافظه مجموع مقادیر و مجموع مربعها را نگه دارید تا میانگین و واریانس نمونهای را محاسبه کنید (لازم نیست همه نمونهها را ذخیره کنید). نکات: از std::mt19937 با یک seed قابل تعیین برای تکرارپذیری استفاده کنید، N بزرگتر دقت را بهبود میدهد، و در صورت نیاز میتوانید با OpenMP حلقه نمونهبرداری را به صورت سادهای موازیسازی کنید تا سرعت را افزایش دهید.
1 پاسخ
جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من
در حال بارگیری...
برای ارسال پاسخ باید با حساب کاربری وارد شوید.
ورود به حساب کاربری
برای تکرارپذیری، از یک seed ثابت مانند 12345 استفاده کن و در صورت استفاده از OpenMP هر نخ RNG مخصوص خود داشته باشد (مثلاً seed + thread_id). از الگوریتم آنلاین مانند Welford برای محاسبه میانگین و واریانس استفاده کن تا خطای عددی کاهش یابد و نیازی به ذخیره همه نمونهها نباشد. هر چه N بزرگتر باشد دقت بهتری میدهد اما زمان را به طور قابل توجهی افزایش میدهد، بنابراین از std::chrono برای اندازهگیری زمان استفاده کن و خلاصهای از آن چاپ کن. برای سرعت بیشتر میتوان حلقه نمونهبرداری را با OpenMP با کاهش (reduction) روی جمعها parallel کرد و از RNGهای thread-local استفاده کرد.
گزارش