সংখ্যাগত সংহতকরণের জন্য সি ++ গ্রন্থাগার (চতুর্ভুজ)


10

সংখ্যার একীকরণের (চতুর্ভুজ) জন্য আমার নিজস্ব সামান্য সাব্রুটিন রয়েছে, যা 1967 সালে বুলির্শ এবং স্টোয়ার দ্বারা প্রকাশিত একটি ALGOL প্রোগ্রামের সি ++ রূপান্তরকরণ (নিউমারিশে ম্যাথাম্যাটিক, 9, 271-278)।

আমি আরও আধুনিক (অভিযোজিত) অ্যালগরিদমে আপগ্রেড করতে চাই এবং ভাবছি যে এরকম কোনও (ফ্রি) সি ++ লাইব্রেরি রয়েছে কিনা। আমার জিএসএল হিসাবে চেহারা ছিল (যা সি) তবে এটি একটি ভয়াবহ এপিআই নিয়ে আসে (যদিও সংখ্যাগুলি ভাল হতে পারে)। আর কিছু আছে?

একটি দরকারী এপিআই দেখতে পাবেন:

double quadrature(double lower_integration_limit,
                  double upper_integration_limit,
                  std::function<double(double)> const&func,
                  double desired_error_bound_relative=1.e-12,
                  double desired_error_bound_absolute=0,
                  double*error_estimate=nullptr);

7
অন্যদিকে, আপনি দেখতে পাবেন যে গণনা বিজ্ঞানের সর্বোত্তম বাস্তবায়নগুলির অনেকগুলি "খারাপ" এপিআই এর সহজ কারণগুলি রয়েছে যেগুলি কয়েক দশক ধরে বিকাশ করা হয়েছিল, অন্যান্য সফ্টওয়্যারগুলির মাস বা বছরের তুলনায়। আমি মনে করি এটি গ্রহণযোগ্য হবে, এবং সম্ভবত আপনার জন্য একটি র‌্যাপার এপিআই লিখতে খুব কার্যকর এবং অভ্যন্তরীণভাবে কম পরিচ্ছন্ন এপিআই কল করুন। এটি আপনাকে আপনার প্রাথমিক কোডগুলিতে একটি দুর্দান্ত এপিআইয়ের সুবিধা দেয় এবং কেবলমাত্র একটি একক ফাংশন পুনর্লিখন করে বিভিন্ন চতুষ্কোণ গ্রন্থাগারের মধ্যে সহজেই স্যুইচ করতে দেয়।
গড্রিক সের

1
@ গড্রিকসির এটি যদি এত সহজ ছিল তবে আমি এটি করতে চাই। তবে তা নয়। জিএসএল এপিআই-এর প্রাক-বরাদ্দযুক্ত বাফার প্রয়োজন, যার মধ্যে সম্ভবত কিছু ব্যবহৃত হয় না, তবে এটি সম্ভবত খুব ছোট হতে পারে (আরও স্মৃতিযুক্ত অন্য কল প্রয়োজন)। একটি যথাযথ বাস্তবায়ন পুনরাবৃত্ত হবে, কোনও বরাদ্দের দরকার নেই, স্ট্যাকের সমস্ত ডেটা রাখবে এবং একটি পরিষ্কার API সরবরাহ করবে।
ওয়াল্টার

1
@ গড্রিকসির জিএসএল এপিআইয়ের সাথে আরও একটি গুরুতর সমস্যা হ'ল এটি কেবল রাষ্ট্র ছাড়াই ফাংশন গ্রহণ করে (কারণ এটি একটি সাধারণ ফাংশন পয়েন্টার ব্যবহার করে)। এ থেকে রাষ্ট্রের সাথে ফাংশনগুলির জন্য থ্রেডসেফ এপিআই তৈরি করা অযোগ্যভাবে অযোগ্য।
ওয়াল্টার

2
আমি গড্রিক সেরের সাথে একমত, একটি র‌্যাপার লেখা সবচেয়ে ভাল বিকল্প। আমি এটি সঠিক বলে মনে করি না যে "জিএসএল কেবল রাষ্ট্র ব্যতীত ফাংশন গ্রহণ করে": এখানে ডক্সে এটি বলে যে gsl_functionএটি একটি ফাংশন পয়েন্টার এবং কিছু অস্বচ্ছ ডেটা পয়েন্টার সহ একসাথে রয়েছে যা আপনার রাজ্যকে ধারণ করে। দ্বিতীয়ত, নির্বিচারে-বড় কাজের বাফারগুলি বরাদ্দ করার বিষয়ে (পুনরায়) কিছু দক্ষতার উদ্বেগ রয়েছে, সুতরাং সেই অংশটির কমপক্ষে কিছুটা বৈধ সমর্থনযোগ্যতা রয়েছে।
কিরিল

1
জিএসএলের প্রাক-বরাদ্দ বাফার সম্পর্কে আরেকটি মন্তব্য। কর্মক্ষেত্রের আকারটি সর্বাধিক সংখ্যার বিরতির ক্ষেত্রে সংজ্ঞায়িত করা হয় - যেহেতু আপনি চান চতুর্ভুজ রীতিটি যে কোনওভাবেই ব্যর্থ হয় যদি এটি অনেক বেশি অভিযোজিত দ্বিখণ্ডার গ্রহণ করে তবে কেবল বিস্ক্রিয়ার সংখ্যার উপর ভিত্তি করে ওয়ার্কস্পেসের আকারটি কিছুটা উপরের সীমাতে নির্ধারণ করুন। আপনি যখন একটি "যথাযথ" বাস্তবায়ন সম্পর্কে কথা বলেন, জিএসএল এখানে "সঠিক" কাজটি করে, এটি বর্তমানে বৃহত্তম ত্রুটির সাথে ব্যবধানকে দ্বিখণ্ডিত করে, এর অর্থ এটি এখন পর্যন্ত সমস্ত ব্যবধানের উপর নজর রাখতে হবে। আপনি যদি স্ট্যাকের সমস্ত ডেটা রাখেন, আপনি স্ট্যাক মেমরিটি চালিয়ে যেতে পারেন, এটি আসলে ভাল নয়।
কিরিল

উত্তর:


3

ওডিন্টটি একবার দেখুন । এটি এখন বুস্টের অংশ এবং এটিতে অন্যদের মধ্যে বুলিরস্ক-স্টোয়ার অ্যালগরিদম অন্তর্ভুক্ত রয়েছে। শুরু করতে আপনি এখানে খুব সাধারণ উদাহরণ দেখতে পারেন ।


3
ওডিন্টের জন্য ওভারভিউয়ের প্রথম বাক্যটি হ'ল: "ওডিন্ট হ'ল সাধারণ ডিফারেনশিয়াল সমীকরণের প্রাথমিক মান সমস্যা (আইভিপি) সমাধানের জন্য একটি গ্রন্থাগার" " আমি যতদূর জানি, এই গ্রন্থাগারটি কোনও পরিচিত ফাংশনের চতুর্ভুজগুলির জন্য ব্যবহার করা যাবে না। আপনার কি উদাহরণ রয়েছে যেখানে এটি চতুর্ভুজটির জন্য ব্যবহৃত হয়েছে?
বিল গ্রিন

1
আমি মনে করি (আমি নিজে গ্রন্থাগারটি ব্যবহার করি না) যে এটিতে নিউটন-কোটেস, রোমবার্গ বা গাউসিয়ান চতুর্ভুজগুলির মতো চতুর্ভুজগুলির জন্য অ্যালগরিদম অন্তর্ভুক্ত নেই তবে এই প্রশ্নটি গ্রেগ-বুলির্চ-স্টোয়ার পদ্ধতির উল্লেখ করে আমি মনে করেছি যে সমস্যাটি হাতে রয়েছে ওডিই ইন্টিগ্রেশন ছিল।
জাইথোস

2

এমএফইএম [1] এর ব্যবহারে সহজেই চতুর্ভুজ ফাংশন রয়েছে (সার্ফাকিক এবং ভলিউমেট্রিক উপাদানগুলির জন্য উভয়ই)। আমরা এগুলিকে বিভিন্ন কাজে ব্যবহার করতে সক্ষম হয়েছি।

[১] http://mfem.org/


2

আপনি সহজেই জিএসএল চতুর্ভুজ ফাংশনগুলির চারপাশে একটি পাতলা সি ++ র‌্যাপার লিখতে পারেন। নিম্নলিখিতগুলির সি ++ 11 প্রয়োজন।

#include <iostream>
#include <cmath>

#include <functional>
#include <memory>
#include <utility>
#include <gsl/gsl_errno.h>
#include <gsl/gsl_integration.h>

template < typename F >
class gsl_quad
{
  F f;
  int limit;
  std::unique_ptr < gsl_integration_workspace,
                    std::function < void(gsl_integration_workspace*) >
                    > workspace;

  static double gsl_wrapper(double x, void * p)
  {
    gsl_quad * t = reinterpret_cast<gsl_quad*>(p);
    return t->f(x);
  }

public:
  gsl_quad(F f, int limit)
    : f(f)
    , limit(limit)
    , workspace(gsl_integration_workspace_alloc(limit), gsl_integration_workspace_free)
  {}

  double integrate(double min, double max, double epsabs, double epsrel)
  {
    gsl_function gsl_f;
    gsl_f.function = &gsl_wrapper;
    gsl_f.params = this;

    double result, error;
    if ( !std::isinf(min) && !std::isinf(max) )
    {
      gsl_integration_qags ( &gsl_f, min, max,
                             epsabs, epsrel, limit,
                             workspace.get(), &result, &error );
    }
    else if ( std::isinf(min) && !std::isinf(max) )
    {
      gsl_integration_qagil( &gsl_f, max,
                             epsabs, epsrel, limit,
                             workspace.get(), &result, &error );
    }
    else if ( !std::isinf(min) && std::isinf(max) )
    {
      gsl_integration_qagiu( &gsl_f, min,
                             epsabs, epsrel, limit,
                             workspace.get(), &result, &error );
    }
    else
    {
      gsl_integration_qagi ( &gsl_f,
                             epsabs, epsrel, limit,
                             workspace.get(), &result, &error );
    }

    return result;
  }
};

template < typename F >
double quad(F func,
            std::pair<double,double> const& range,
            double epsabs = 1.49e-8, double epsrel = 1.49e-8,
            int limit = 50)
{
  return gsl_quad<F>(func, limit).integrate(range.first, range.second, epsabs, epsrel);
}

int main()
{
  std::cout << "\\int_0^1 x^2 dx = "
            << quad([](double x) { return x*x; }, {0,1}) << '\n'
            << "\\int_1^\\infty x^{-2} dx = "
            << quad([](double x) { return 1/(x*x); }, {1,INFINITY}) << '\n'
            << "\\int_{-\\infty}^\\infty \\exp(-x^2) dx = "
            << quad([](double x) { return std::exp(-x*x); }, {-INFINITY,INFINITY}) << '\n';
}

আউটপুট

\int_0^1 x^2 dx = 0.333333
\int_1^\infty x^{-2} dx = 1
\int_{-\infty}^\infty \exp(-x^2) dx = 1.77245

1

কিউবারিটি লাইব্রেরিতে আমার সাফল্য আছে (এটি সি তে লেখা আছে)। এটি অপেক্ষাকৃত কম সংখ্যক মাত্রার সাথে বহুমাত্রিক একীকরণের লক্ষ্য।

HIntLib গ্রন্থাগার সি লেখা আছে ++ এবং এটা অভিযোজিত পাদসংস্থান (cubature) জন্য রুটিন হয়েছে।


1

পরীক্ষা করে দেখুন https://github.com/tbs1980/NumericalIntegration । এটি কোয়াডপ্যাকের উপর ভিত্তি করে (যা জিএসএলও উপর ভিত্তি করে), এবং কিছু ঝরঝরে আধুনিক বৈশিষ্ট্য রয়েছে, যেমন ইগান, মাল্টিপ্রেসিশন সাপোর্টের উপর ভিত্তি করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.