یک برنامه 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 حلقه نمونه‌برداری را به صورت ساده‌ای موازی‌سازی کنید تا سرعت را افزایش دهید.

توسط پژوهشگر در 221 روز قبل ساعت 01:15
دسته بندی ها: C Plus Plus C Plus Plus for beginner
nima در 221 روز قبل ساعت 13:58

برای تکرارپذیری، از یک seed ثابت مانند 12345 استفاده کن و در صورت استفاده از OpenMP هر نخ RNG مخصوص خود داشته باشد (مثلاً seed + thread_id). از الگوریتم آنلاین مانند Welford برای محاسبه میانگین و واریانس استفاده کن تا خطای عددی کاهش یابد و نیازی به ذخیره همه نمونه‌ها نباشد. هر چه N بزرگ‌تر باشد دقت بهتری می‌دهد اما زمان را به طور قابل توجهی افزایش می‌دهد، بنابراین از std::chrono برای اندازه‌گیری زمان استفاده کن و خلاصه‌ای از آن چاپ کن. برای سرعت بیشتر می‌توان حلقه نمونه‌برداری را با OpenMP با کاهش (reduction) روی جمع‌ها parallel کرد و از RNGهای thread-local استفاده کرد.

گزارش

1 پاسخ

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

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