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

1.0 بازدید آخرین ویرایش در 220 روز قبل ساعت 02:00

0.0

از فرمول ذوزنقه‌ای استفاده کنید: I ≈ h*( (f(a)+f(b))/2 + Σ f(a + i*h) ) با h=(b-a)/n. در C++ از نوع double برای دقت استفاده کرده، برای اندازه‌گیری زمان از std::chrono بهره ببرید و مقدار دقیق تحلیلی ∫_a^b sin(x) dx = -cos(b)+cos(a) را برای محاسبه خطا به کار ببرید. برای نسخه موازی با OpenMP حلقه جمع را با reduction جمع ببندید (مثلاً #pragma omp parallel for reduction(+ : sum)) و برنامه را با -fopenmp کامپایل کنید؛ همچنین به انتخاب مناسب n برای کاهش خطای گسسته و جلوگیری از مشکلات گرد شدگی توجه کنید.

توسط پژوهشگر در 220 روز قبل ساعت 02:00
دسته بندی ها: C Plus Plus C Plus Plus for beginner
sara در 220 روز قبل ساعت 11:14

برای دقت بهتر در تخمین با روش ذوزنقه‌ای، n را به اندازه کافی بزرگ انتخاب کنید و از double برای همه محاسبات استفاده کنید تا از گرد شدن جلوگیری شود. در بازه‌های طولانی ممکن است خطای گرد شدن تجمعی شود، پس تست مختلفی با nهای مختلف انجام دهید و به حد همگرایی برسید. در نسخه موازی OpenMP از #pragma omp parallel for reduction(+ : sum) استفاده کنید و زمان اجرایی را با std::chrono مقایسه کنید، همچنین کامپایلر را با -fopenmp فعال کنید تا بار کار بین تردها درست تقسیم شود. برای ارزیابی خطا از مقدار دقیق تحلیلی -cos(b) + cos(a) استفاده کنید و در نهایت به انتخاب مناسب n برای کاهش خطاهای گسستگی و جلوگیری از تجمع خطا توجه کنید.

گزارش

1 پاسخ

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

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