একটি রৈখিক সমীকরণ সমাধান

আমি প্রোগ্রামারিকভাবে সি, লক্ষ্য সি, অথবা (যদি প্রয়োজন) সি ++ রৈখিক সমীকরণগুলির একটি সিস্টেম সমাধান করতে চাই।

এখানে সমীকরণ একটি উদাহরণ:

-44.3940 = a * 50.0 + b * 37.0 + tx
-45.3049 = a * 43.0 + b * 39.0 + tx
-44.9594 = a * 52.0 + b * 41.0 + tx

এই থেকে, আমি a , b এবং tx এর জন্য সর্বোত্তম পরিমাপ পেতে চাই।

0
অন্যান্য মানুষের এই উত্তর আছে, কিন্তু বই পরীক্ষা সংখ্যাসূচক বিশ্লেষণ: বৈজ্ঞানিক কম্পিউটিং এর গণিত কিনকাড এবং চেনি দ্বারা। বই সমীকরণের বিভিন্ন পদ্ধতিগুলি সমাধান করার প্রধান কারণ।
যোগ লেখক Matthew, উৎস

13 উত্তর

রেটিনউয়ারের "ফ্রি লাই আলেজব্রাস" বিভাগে, বিভাগ 7.6.2:

A direct bijection between primitive necklaces of length n over F and the set of irreducible polynomials of degree n in F[x] may be described as follows: let K be the field with qn elements; it is a vector space of dimension n over F, so there exists in K an element θ such that the set {θ, θq, ..., θqn-1} is a linear basis of K over F.

With each word w = a0...an-1 of length n on the alphabet F, associate the element β of K given by β = a0θ + a1θq + ... + an-1 θqn-1. It is easily shown that to conjugate words w, w' correspond conjugate elements β, β' in the field extension K/F, and that w \mapsto β is a bijection. Hence, to a primitive conjugation class corresponds a conjugation class of cardinality n in K; to the latter corresponds a unique irreducible polynomial of degree n in F[x]. This gives the desired bijection.

25
যোগ

See section 38.10 "Generating irreducible polynomials from Lyndon words" of http://www.jjj.de/fxt/#fxtbook

4
যোগ

আমি বিশ্বাস করি এই ধরনের একটি বিজয়ের মধ্যে উপস্থাপন করা হয়

এস Golomb Irreducible polynomials, সমন্বয় কোড, আদিম নেকলেস এবং সাইক্লোটোমিক বীজগণিত প্রসপ মধ্যে কনফ কনবিয়টারিয়াল ম্যাথ এবং তার ফল।, পৃষ্ঠা 358- 370, চ্যাপেল হিল, 1969. ইউনিভ উত্তর ক্যারোলিনা প্রেস এর

কিন্তু আমার কাছে এই পত্রিকায় তাত্ক্ষণিক অ্যাক্সেস নেই - আমি নিশ্চিত যে এটা সেখানেই আছে।

3
যোগ
অতিরিক্ত প্রমাণের একটি ক্ষুদ্র বিট (এখনও চূড়ান্ত নয়): springerlink.com/index/P6X9P2BV73L2X2GG.pdf "যেহেতু লিন্ডন শব্দগুলির মধ্যে একটি কার্ডিনাল K এর বর্ণমালার উপর এবং FK [10] এর উপরে অপ্রচলিত polynomials উপর একটি বিজোড় উপস্থিত রয়েছে ..." যেখানে রেফারেন্স [10] Golomb এর কাগজ হয়।
যোগ লেখক CodingWithoutComments, উৎস
যোগ লেখক Qiaochu Yuan, উৎস

Golomb দ্বারা উদ্ভাবিত চিড়িয়াখানা একটি আদিম উপাদান একটি ক্রম q ^ n ক্ষেত্রের মধ্যে উপর নির্ভর করে। তারপর, প্রতিটি লিন্ডন শব্দ L = (l_0, l_1, ..., l_ {n-1}) থেকে একটি আদিম পলিমোমিয়ালকে একটি মূল উপাদান হিসাবে নির্ধারণ করে যা একটি ^ {m (L)} যেখানে m (L) হল l_i * q ^ i ওভার i = 0,1, ..., n-1 এর পূর্ণসংখ্যা যোগফল।

3
যোগ

আপনি একটি সফ্টওয়্যার প্যাকেজ খুঁজছেন যে কাজ করতে হবে বা আসলে ম্যাট্রিক্স অপারেশন করছেন এবং প্রতিটি পদক্ষেপ কি?

প্রথমত, আমার একজন সহকর্মী শুধু ওকলাল জিএলপি কে ব্যবহার করেছেন। এটি শুধুমাত্র পিডিএফ । যদি আপনি নির্দিষ্ট সাহায্যের জন্য নির্দিষ্ট সাহায্যের প্রয়োজন হয় তবে আমাদের জানান এবং আমি নিশ্চিত, আমার বা কেউ ফিরে আসবে এবং সাহায্য করবে, কিন্তু, আমি মনে করি এটি এখানে থেকে সরাসরি সোজা। গুড লাক!

0
যোগ

ব্যক্তিগতভাবে, আমি সংখ্যাসূচক রেসিপি এর অ্যালগরিদমগুলি আংশিক। (আমি C ++ সংস্করণ পছন্দ করি।)

এই অ্যালগোরিদমগুলি কাজ করে কেন এই বইটি আপনাকে শিখাবে, প্লাস আপনাকে সেইসব অ্যালগরিদমগুলির বেশ সুন্দর ডিবাগেড প্রয়োগগুলি দেখাবে।

অবশ্যই, আপনি কেবল অন্ধভাবে CLAPACK ব্যবহার করতে পারেন (আমি এটি সফলতার সাথে ব্যবহার করেছি), কিন্তু আমি প্রথম দিকে গাওশীয় এলিমিনেশন আলগোরিদিমকে টাইপ করবো যাতে কমপক্ষে এই ধরনের অ্যালগরিদমগুলি স্থিতিশীল করতে চলেছে এমন ধরনের কাজের একটি দুর্বল ধারণা আছে।

পরবর্তীতে, যদি আপনি আরও আকর্ষণীয় রৈখিক বীজগাণ করছেন, তাহলে অক্টেভ এর উত্স কোডটি দেখতে পাবেন অনেক প্রশ্ন উত্তর দেবে

0
যোগ

আপনি একটি প্রোগ্রামের সাথে এটি ঠিক একই ভাবে সমাধান করতে পারেন হাত দ্বারা এটি (গুণ এবং বিয়োগ সঙ্গে, তারপর ফলাফল ফিরে সমীকরণ মধ্যে ভোজন)। এই চমত্কার মান মাধ্যমিক-স্কুল-স্তরের গণিত।

-44.3940 = 50a + 37b + c (A)
-45.3049 = 43a + 39b + c (B)
-44.9594 = 52a + 41b + c (C)

(A-B): 0.9109 =  7a -  2b (D)
(B-C): 0.3455 = -9a -  2b (E)

(D-E): 1.2564 = 16a (F)

(F/16):  a = 0.078525 (G)

Feed G into D:
       0.9109 = 7a - 2b
    => 0.9109 = 0.549675 - 2b (substitute a)
    => 0.361225 = -2b (subtract 0.549675 from both sides)
    => -0.1806125 = b (divide both sides by -2) (H)

Feed H/G into A:
       -44.3940 = 50a + 37b + c
    => -44.3940 = 3.92625 - 6.6826625 + c (substitute a/b)
    => -41.6375875 = c (subtract 3.92625 - 6.6826625 from both sides)

তাই আপনি সঙ্গে শেষ:

a =   0.0785250
b =  -0.1806125
c = -41.6375875

যদি আপনি এই মানগুলিকে আবার A, B এবং C এ পুনরায় প্লাগ করেন, তাহলে আপনি সঠিকভাবে খুঁজে পাবেন।

কৌতুক একটি সহজ 4x3 ম্যাট্রিক্স যা একটি 3x2 ম্যাট্রিক্স এর পরিবর্তে হ্রাস করা হয়, তারপর একটি 2x1 যা "একটি = n", n একটি প্রকৃত সংখ্যা হচ্ছে ব্যবহার করা হয়। একবার আপনি যে আছে, আপনি পরবর্তী ম্যাট্রিক্স আপ এটি অন্য মূল্য পেতে ভাগ, পরবর্তী দুটি ম্যাট্রিক্স মধ্যে যারা দুই মান আপ পর্যন্ত আপনি সব ভেরিয়েবল সমাধান করেছি পর্যন্ত

আপনি N পৃথক সমীকরণ আছে প্রদান, আপনি সবসময় এন ভেরিয়েবল জন্য সমাধান করতে পারেন আমি আলাদা কথা বলছি কারণ এই দুটি নয়:

 7a + 2b =  50
14a + 4b = 100

তারা একই সমীকরণ দুটি দ্বারা গুণিত হয় তাই আপনি তাদের কাছ থেকে কোনও সমাধান পাবেন না - প্রথমত দুটি গুণ বাড়িয়ে তারপর আপনাকে বিয়োগ করে সত্য বিবৃতি দিয়ে বিয়োগ করে:

0 = 0 + 0

উদাহরণস্বরূপ, এখানে কিছু সি কোড রয়েছে যা আপনার সমীক্ষায় আপনার সমীক্ষায় উপস্থাপন করা হয়। প্রথমে কিছু প্রয়োজনীয় প্রকার, ভেরিয়েবল, একটি সমীকরণ ছাপানোর জন্য একটি সমর্থন ফাংশন এবং প্রধান এর শুরু:

#include 

typedef struct { double r, a, b, c; } tEquation;
tEquation equ1[] = {
    { -44.3940,  50, 37, 1 },      // -44.3940 = 50a + 37b + c (A)
    { -45.3049,  43, 39, 1 },      // -45.3049 = 43a + 39b + c (B)
    { -44.9594,  52, 41, 1 },      // -44.9594 = 52a + 41b + c (C)
};
tEquation equ2[2], equ3[1];

static void dumpEqu (char *desc, tEquation *e, char *post) {
    printf ("%10s: %12.8lf = %12.8lfa + %12.8lfb + %12.8lfc (%s)\n",
        desc, e->r, e->a, e->b, e->c, post);
}

int main (void) {
    double a, b, c;

পরবর্তী তিনটি অস্তিত্বের তিনটি সমীকরণের দুই অজ্ঞার সাথে দুটি সমীকরণের হ্রাস পরবর্তী:

    // First step, populate equ2 based on removing c from equ.

    dumpEqu (">", &(equ1[0]), "A");
    dumpEqu (">", &(equ1[1]), "B");
    dumpEqu (">", &(equ1[2]), "C");
    puts ("");

    // A - B
    equ2[0].r = equ1[0].r * equ1[1].c - equ1[1].r * equ1[0].c;
    equ2[0].a = equ1[0].a * equ1[1].c - equ1[1].a * equ1[0].c;
    equ2[0].b = equ1[0].b * equ1[1].c - equ1[1].b * equ1[0].c;
    equ2[0].c = 0;

    // B - C
    equ2[1].r = equ1[1].r * equ1[2].c - equ1[2].r * equ1[1].c;
    equ2[1].a = equ1[1].a * equ1[2].c - equ1[2].a * equ1[1].c;
    equ2[1].b = equ1[1].b * equ1[2].c - equ1[2].b * equ1[1].c;
    equ2[1].c = 0;

    dumpEqu ("A-B", &(equ2[0]), "D");
    dumpEqu ("B-C", &(equ2[1]), "E");
    puts ("");

পরবর্তী, এক অজ্ঞাত এক সমীকরণ দুটি অজ্ঞাত সঙ্গে দুটি সমীকরণের হ্রাস:

    // Next step, populate equ3 based on removing b from equ2.

    // D - E
    equ3[0].r = equ2[0].r * equ2[1].b - equ2[1].r * equ2[0].b;
    equ3[0].a = equ2[0].a * equ2[1].b - equ2[1].a * equ2[0].b;
    equ3[0].b = 0;
    equ3[0].c = 0;

    dumpEqu ("D-E", &(equ3[0]), "F");
    puts ("");

Now that we have a formula of the type number1 = unknown * number2, we can simply work out the unknown value with unknown <- number1 / number2. Then, once you've figured that value out, substitute it into one of the equations with two unknowns and work out the second value. Then substitute both those (now-known) unknowns into one of the original equations and you now have the values for all three unknowns:

    // Finally, substitute values back into equations.

    a = equ3[0].r / equ3[0].a;
    printf ("From (F    ), a = %12.8lf (G)\n", a);

    b = (equ2[0].r - equ2[0].a * a) / equ2[0].b;
    printf ("From (D,G  ), b = %12.8lf (H)\n", b);

    c = (equ1[0].r - equ1[0].a * a - equ1[0].b * b) / equ1[0].c;
    printf ("From (A,G,H), c = %12.8lf (I)\n", c);

    return 0;
}

এই কোডটির আউটপুট এই উত্তরের আগের হিসাবগুলির সাথে মেলে:

         >: -44.39400000 =  50.00000000a +  37.00000000b +   1.00000000c (A)
         >: -45.30490000 =  43.00000000a +  39.00000000b +   1.00000000c (B)
         >: -44.95940000 =  52.00000000a +  41.00000000b +   1.00000000c (C)

       A-B:   0.91090000 =   7.00000000a +  -2.00000000b +   0.00000000c (D)
       B-C:  -0.34550000 =  -9.00000000a +  -2.00000000b +   0.00000000c (E)

       D-E:  -2.51280000 = -32.00000000a +   0.00000000b +   0.00000000c (F)

From (F    ), a =   0.07852500 (G)
From (D,G  ), b =  -0.18061250 (H)
From (A,G,H), c = -41.63758750 (I)
0
যোগ

আপনার প্রশ্নটি শব্দ থেকে, মনে হচ্ছে আপনি অজানা থেকে আরও সমীকরণ আছে এবং আপনি অসঙ্গতি হ্রাস করতে চান। এটি সাধারণত রৈখিক রিগ্রেশন দিয়ে করা হয়, যা বিচ্ছিন্নতার স্কয়ারগুলির সমষ্টিকে কম করে দেয়। ডাটা আকারের উপর নির্ভর করে, আপনি এটি একটি স্প্রেডশীট বা একটি পরিসংখ্যান প্যাকেজে করতে পারেন। আর একটি উচ্চ মানের, বিনামূল্যে প্যাকেজ যা রৈখিক রিগ্রেশন যা অন্য অনেকগুলি জিনিসের মধ্যে। রৈখিক রিগ্রেশন (এবং প্রচুর পরিমাণে) এর অনেকগুলি আছে, কিন্তু সহজ বিষয়গুলির জন্য এটি সহজবোধ্য। এখানে আপনার তথ্য ব্যবহার করে একটি R উদাহরণ। মনে রাখবেন "tx" হল আপনার মডেলের মধ্যস্থতা।

> y <- c(-44.394, -45.3049, -44.9594)
> a <- c(50.0, 43.0, 52.0)
> b <- c(37.0, 39.0, 41.0)
> regression = lm(y ~ a + b)
> regression

Call:
lm(formula = y ~ a + b)

Coefficients:
(Intercept)            a            b  
  -41.63759      0.07852     -0.18061  
0
যোগ

In terms of run-time efficiency, others have answered better than I. If you always will have the same number of equations as variables, I like Cramer's rule as it's easy to implement. Just write a function to calculate determinant of a matrix (or use one that's already written, I'm sure you can find one out there), and divide the determinants of two matrices.

0
যোগ

Cramer's Rule and Gaussian Elimination are two good, general-purpose algorithms (also see Simultaneous Linear Equations). If you're looking for code, check out GiNaC, Maxima, and SymbolicC++ (depending on your licensing requirements, of course).

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

0
যোগ
প্রকৃতপক্ষে, বাস্তব জগতের মধ্যে কোনও ক্রামারের শাসন বা গৌড়ীয় উপাধি খুব ভাল। ভাল সংখ্যাসূচক বৈশিষ্ট্য আছে, এবং গুরুতর অ্যাপ্লিকেশন জন্য অনেক ব্যবহার করা হয় না। LDU ফ্যাক্টক্যাটাইজেশন চেষ্টা করুন বা ভাল, অ্যালগরিদম সম্পর্কে চিন্তা করবেন না, এবং তার পরিবর্তে LAPACK ব্যবহার করুন।
যোগ লেখক Peter, উৎস
ভেরিয়েবলের সংখ্যা 4 এর চেয়ে কম, ক্র্যাডারের নিয়ম সমাধান কোড আইএমও লেখার জন্য সর্বোত্তম
যোগ লেখক Ge Rong, উৎস

Template Numerical Toolkit from NIST has tools for doing that.

আরো একটি নির্ভরযোগ্য উপায় হল একটি QR Decomposition ব্যবহার করা।

এখানে একটি wrapper একটি উদাহরণ যাতে আমি কল করতে পারেন "GetInverse (একটি, InvA)" আমার কোড এবং এটি ইনভোতে বিপরীত করা হবে।

void GetInverse(const Array2D& A, Array2D& invA)
   {
   QR qr(A);  
   invA = qr.solve(I); 
   }

Array2D লাইব্রেরিতে সংজ্ঞায়িত করা হয়।

0
যোগ
আমিqr.solve (I) কি কি?
যোগ লেখক Ponkadoodle, উৎস

মাইক্রোসফট সলভার ফাউন্ডেশন এ এক নজরে দেখুন।

এটি দিয়ে আপনি এই ধরনের কোড লিখতে পারেন:

  SolverContext context = SolverContext.GetContext();
  Model model = context.CreateModel();

  Decision a = new Decision(Domain.Real, "a");
  Decision b = new Decision(Domain.Real, "b");
  Decision c = new Decision(Domain.Real, "c");
  model.AddDecisions(a,b,c);
  model.AddConstraint("eqA", -44.3940 == 50*a + 37*b + c);
  model.AddConstraint("eqB", -45.3049 == 43*a + 39*b + c);
  model.AddConstraint("eqC", -44.9594 == 52*a + 41*b + c);
  Solution solution = context.Solve();
  string results = solution.GetReport().ToString();
  Console.WriteLine(results); 

Here is the output:
===Solver Foundation Service Report===
Datetime: 04/20/2009 23:29:55
Model Name: Default
Capabilities requested: LP
Solve Time (ms): 1027
Total Time (ms): 1414
Solve Completion Status: Optimal
Solver Selected: Microsoft.SolverFoundation.Solvers.SimplexSolver
Directives:
Microsoft.SolverFoundation.Services.Directive
Algorithm: Primal
Arithmetic: Hybrid
Pricing (exact): Default
Pricing (double): SteepestEdge
Basis: Slack
Pivot Count: 3
===Solution Details===
Goals:

Decisions:
a: 0.0785250000000004
b: -0.180612500000001
c: -41.6375875

0
যোগ
সুতরাং, আমরা কি এই সংখ্যাসূচক স্থায়িত্বের সম্পত্তি থেকে আশা করতে পারি? যেহেতু এটি ওপেন সোর্স নয়, এটি যথাযথ অধ্যয়ন সঙ্গে আসা অনুমিত, LAPACK মত মূলধারার লাইব্রেরি বিরুদ্ধে benchmarks ইত্যাদি। একটি মালিকানা সমাধান সঙ্গে যেতে থাকার অত্যধিক যাও কিছু যথেষ্ট সুবিধা হতে আছে আছে।
যোগ লেখক Evgeni Sergeev, উৎস
function x = LinSolve(A,y)
%
% Recursive Solution of Linear System Ax=y
% matlab equivalent: x = A\y 
% x = n x 1
% A = n x n
% y = n x 1
% Uses stack space extensively. Not efficient.
% C allows recursion, so convert it into C. 
% ----------------------------------------------
n=length(y);
x=zeros(n,1);
if(n>1)
    x(1:n-1,1) = LinSolve( A(1:n-1,1:n-1) - (A(1:n-1,n)*A(n,1:n-1))./A(n,n) , ...
                           y(1:n-1,1) - A(1:n-1,n).*(y(n,1)/A(n,n))); 
    x(n,1) = (y(n,1) - A(n,1:n-1)*x(1:n-1,1))./A(n,n); 
else
    x = y(1,1) / A(1,1);
end
0
যোগ
সুতরাং যদি A (n, n) শূন্য হয়?
যোগ লেখক Evgeni Sergeev, উৎস