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; }
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)