Derivada parcial de un polinomio usando Lista doblemente enlazada

Dado un polinomio de 2 variables representado por una lista doblemente enlazada , la tarea es encontrar la derivada parcial de un polinomio almacenado en la lista doblemente enlazada.

Ejemplos:

Entrada: P(x, y) = 2(x^3 y^4) + 3(x^5 y^7) + 1(x^2 y^6)
Salida:
Derivadas parciales con x: 6(x^2 y^4) + 15(x^4 y^7) + 2(x^1 y^6)
Derivadas parciales sobre y: 24(x^2 y^3) + 105(x^4 y^6) + 12 (x^1 y^5)
Derivadas parciales con x e y: 144(x^1 y^2) + 2520(x^3 y^5) + 60(x^0 y^4)

Entrada: P(x, y) = 3(x^2 y^1) + 4(x^2 y^3) + 2(x^4 y^7)
Salida:
Derivadas parciales con x: 6(x^1 y^1) + 8(x^1 y^3) + 8(x^3 y^7)
Derivadas parciales con y: 6(x^1 y^0) + 24(x^1 y^2) + 56 (x^3 y^6)
Derivadas parciales con x e y: 48(x^0 y^1) + 1008(x^2 y^5)

Enfoque: siga los pasos a continuación para resolver este problema:

  • Declare una clase o estructura para almacenar el contenido de un Node, es decir, datos que representan el coeficiente, power1 que representa la potencia a la que se eleva x , power2 que representa la potencia a la que se eleva y , y los punteros a su siguiente y anterior Node.
  • Declare funciones para calcular derivadas con respecto a x , derivadas con respecto a y y derivadas con respecto a x e y .
  • Calcula e imprime las derivadas obtenidas.

A continuación se muestra la implementación del enfoque anterior:

C++

// C++ program for the above approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Structure of a node
struct node {
    node* link1 = NULL;
    node* link2 = NULL;
    int data = 0;
    int pow1 = 0;
    int pow2 = 0;
};
 
// Function to generate Doubly Linked
// List from given parameters
void input_equation(node*& head, int d,
                    int p1, int p2)
{
    node* temp = head;
 
    // If list is empty
    if (head == NULL) {
 
        // Create new node
        node* ptr = new node();
        ptr->data = d;
        ptr->pow1 = p1;
        ptr->pow2 = p2;
 
        // Set it as the head
        // of the linked list
        head = ptr;
    }
 
    // If list is not empty
    else {
 
        // Temporarily store
        // address of the head node
        temp = head;
 
        // Traverse the linked list
        while (temp->link2 != NULL) {
 
            // Link to next node
            temp = temp->link2;
        }
 
        // Create new node
        node* ptr = new node();
        ptr->data = d;
        ptr->pow1 = p1;
        ptr->pow2 = p2;
 
        // Connect the nodes
        ptr->link1 = temp;
        temp->link2 = ptr;
    }
}
 
// Function to calculate partial
// derivative w.r.t. X
void derivation_with_x(node*& head)
{
    cout << "Partial derivatives"
         << " w.r.t. x: ";
 
    node* temp = head;
 
    // Traverse the Linked List
    while (temp != NULL) {
 
        if (temp->pow1 != 0) {
            temp->data = (temp->data)
                         * (temp->pow1);
            temp->pow1 = temp->pow1 - 1;
        }
        else {
            temp->data = 0;
            temp->pow1 = 0;
            temp->pow2 = 0;
        }
 
        temp = temp->link2;
    }
 
    temp = head;
 
    cout << " " << temp->data
         << "(x^" << temp->pow1
         << " y^" << temp->pow2
         << ")";
    temp = temp->link2;
 
    while (temp != NULL) {
        cout << " + "
             << temp->data << "(x^"
             << temp->pow1 << " y^"
             << temp->pow2 << ")";
        temp = temp->link2;
    }
 
    cout << "\n";
}
 
// Function to calculate partial
// derivative w.r.t. Y
void derivation_with_y(node*& head)
{
    cout << "Partial derivatives"
         << " w.r.t. y: ";
 
    node* temp = head;
 
    // Traverse the Linked List
    while (temp != NULL) {
 
        if (temp->pow2 != 0) {
            temp->data = (temp->data)
                         * (temp->pow2);
            temp->pow2 = temp->pow2 - 1;
        }
        else {
            temp->data = 0;
            temp->pow1 = 0;
            temp->pow2 = 0;
        }
 
        temp = temp->link2;
    }
 
    temp = head;
    cout << " "
         << temp->data
         << "(x^" << temp->pow1
         << " y^"
         << temp->pow2 << ")";
    temp = temp->link2;
 
    while (temp != NULL) {
        cout << " + "
             << temp->data << "(x^"
             << temp->pow1 << " y^"
             << temp->pow2 << ")";
        temp = temp->link2;
    }
    cout << "\n";
}
 
// Function to calculate partial
// derivative w.r.t. XY
void derivation_with_x_y(node*& head)
{
    cout << "Partial derivatives"
         << " w.r.t. x and y: ";
 
    node* temp = head;
 
    // Derivative with respect to
    // the first variable
    while (temp != NULL) {
        if (temp->pow1 != 0) {
 
            temp->data = (temp->data)
                         * (temp->pow1);
            temp->pow1 = temp->pow1 - 1;
        }
 
        else {
            temp->data = 0;
            temp->pow1 = 0;
            temp->pow2 = 0;
        }
 
        temp = temp->link2;
    }
    temp = head;
 
    // Derivative with respect to
    // the second variable
    while (temp != NULL) {
 
        if (temp->pow2 != 0) {
            temp->data = (temp->data)
                         * (temp->pow2);
            temp->pow2 = temp->pow2 - 1;
        }
 
        else {
            temp->data = 0;
            temp->pow1 = 0;
            temp->pow2 = 0;
        }
 
        temp = temp->link2;
    }
 
    temp = head;
    cout << " "
         << temp->data << "(x^"
         << temp->pow1 << " y^"
         << temp->pow2 << ")";
 
    temp = temp->link2;
 
    // Print the list after the
    // calculating the derivative
    while (temp != NULL) {
 
        cout << " + "
             << temp->data << "(x^"
             << temp->pow1 << " y^"
             << temp->pow2 << ")";
        temp = temp->link2;
    }
    cout << "\n";
}
 
// Driver Code
int main()
{
    node* head1 = NULL;
 
    // Creating doubly-linked list
    input_equation(head1, 2, 3, 4);
    input_equation(head1, 3, 5, 7);
    input_equation(head1, 1, 2, 6);
 
    // Function Call
    derivation_with_x(head1);
    derivation_with_y(head1);
    derivation_with_x_y(head1);
 
    return 0;
}
Producción: 

Partial derivatives w.r.t. x:  6(x^2 y^4) + 15(x^4 y^7) + 2(x^1 y^6)
Partial derivatives w.r.t. y:  24(x^2 y^3) + 105(x^4 y^6) + 12(x^1 y^5)
Partial derivatives w.r.t. x and y:  144(x^1 y^2) + 2520(x^3 y^5) + 60(x^0 y^4)

 

Complejidad temporal: O(N)
Espacio auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por harsh2608 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *