No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Funciones afines

15/28
Recursos

Aportes 56

Preguntas 3

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Aquí mi aporte del ultimo problema, me llevo algo de rato, ya que es un tema que tenia rato de no ver, tuve que repasar algunos conceptos de matrices, hacer varias preguntas… XD, lo que explicare será la forma de obtener los valores de a y b:

hay distintas formas de ver este problema para llegar a la solución, una vez terminé de ver la clase, lo primero hice fue tratar de implementar algún código para encontrar los vectores a y b, como no llegaba a nada, toco plantear el sistema de ecuaciones

35 = [a0 a1 a2][10 10 10] + b
60 = [a0 a1 a2][100 10 10] + b
75 = [a0 a1 a2][10 100 10] + b
65 = [a0 a1 a2][10 10 100] + b

cada ecuación representa las situaciones descritas en el problemas

operando las matrices a y p como indica la función, se obtiene lo siguiente
35 = 10 a0 + 10 a1 + 10 a2 + b
60 = 100 a0 + 10 a1 + 10 a2 + b
75 = 10 a0 + 100 a1 + 10 a2 + b
65 = 10 a0 + 10 a1 + 100 a2 + b
así tenemos un sistema de 4 ecuaciones y 4 incógnitas, que es posible resolver de distintas formas, una de ellas es escribir el sistema en su forma matricial, el termino “matricial” no se ha usado mucho hasta ahora en el curso, pero es como si habláramos de stacks de vectores. este sistema se puede resolver con la función linalg.solve de Numpy, la cual nos devolvera en un array con los valores de a0, a1, a2 y b, aqui les dejo un video con explicacion y el codigo implementado
https://www.youtube.com/watch?v=G28bJYdqOFQ

import numpy as np

def run():
    
    ecuacion1="10*a0+10*a1+10*a2+b=35"
    ecuacion2="100*a0+10*a1+10*a2+b=60"
    ecuacion3="10*a0+100*a1+10*a2+b=70"
    ecuacion4="10*a0+10*a1+100*a2+b=65"

    p=np.array([[10,10,10,1],[100,10,10,1],[10,100,10,1],[10,10,100,1]]) #matrix de coeficientes, potencias de los controladores
    t=np.array([35,60,70,65]) #matriz de soluciones, temperaturas
    
    a=np.linalg.solve(p,t) #obtengo los valores de a y b

    print(a)

if __name__ == "__main__":
    run()

ejecutando, tenemos el siguiente output:

por lo tanto a0=0.2777778, a1=0.3888889, a2=0.33333 y b=25
así ya hemos encontrado las entradas del vector a y el valor de b, y podemos escribir nuestra función T§=a*P+b

ahora bien, si vienen siguiendo la ruta de aprendizaje de escuela de Data Science, habrán pasado por algunos cursos del profesor David Aroesti o el curso de matemáticas para data Science: probabilidad. https://platzi.com/clases/ds-probabilidad/ del profesor Francisco Camacho, que fue agregado recientemente. en ellos se nos ha hablado de la regresión lineal o el metodo de minimos cuadrados, los cuales son altamente aplicables en este problema.

si usamos otro enfoque, lo que tenemos son una serie de datos experimentales que corresponden las temperaturas obtenidas según la configuración de los procesadores, entonces requerimos una función o polinomio que se ajuste al comportamiento de los datos, para nuestra suerte, el ejercicio nos dice que esta función es afín, T§=aP+b lo que nos indica que buscamos un polinomio de grado 1 de la forma y=ax+b, una funcion lineal, y benditas sean las librerías como numpy o Scikitlearn que nos brindan métodos para lograr esto, les comparto mi código, en donde se aplican varias formas de obtener los coeficientes a y el valor de b:

import numpy as np
from sklearn.linear_model import LinearRegression

def datos_experimentales():
    p_0=np.array([10,10,10]) #en reposo
    p_1=np.array([100,10,10])
    p_2=np.array([10,100,10])
    p_3=np.array([10,10,100])
    
    p=np.array([p_0,p_1,p_2,p_3])
    t=np.array([35,60,75,65])
    
    return p, t

def solucion_metodo1(): #resolvinedo el sistema de ecuaciones
    ecuacion1="10*a0+10*a1+10*a2+b=35"
    ecuacion2="100*a0+10*a1+10*a2+b=60"
    ecuacion3="10*a0+100*a1+10*a2+b=70"
    ecuacion4="10*a0+10*a1+100*a2+b=65"
    
    p=np.array([[10,10,10,1],[100,10,10,1],[10,100,10,1],[10,10,100,1]]) #matrix de coeficientes, potencias de los controladores
    t=np.array([35,60,70,65]) #matriz de soluciones, temperaturas
    
    a=np.linalg.solve(p,t) #obtengo los valores de a y b
    return a

def solucion_metodo2(): #usando minimos cuadrados, numpy.linalg.lstsq
    # Experimental data:
    p,t=datos_experimentales()
    
    A = np.column_stack([p, np.ones(len(p))])
    coefs = np.linalg.lstsq(A, t, rcond=-1)[0]
    
    return coefs

def solucion_metodo3(): #regresion lineal con sklearn.linear_model
    model = LinearRegression()
    
    # Experimental data:
    p,t=datos_experimentales()

    model.fit(X=p, y=t)

    print("coeff: ", *model.coef_)
    print("intercept: ", model.intercept_)
    
def run():
    print("********metodo1, resolvinedo el sistema de ecuaciones*******")
    print(solucion_metodo1())
    print("********metodo2, usando minimos cuadrados, numpy.linalg.lstsq*******")
    print(solucion_metodo2())
    print("********metodo3, regresion lineal con sklearn.linear_model*******")
    solucion_metodo3()
if __name__ == "__main__":
    run()

Output:

Espero que esto ayude, hare otro aporte respondiendo a los incisos usando los resultados obtenidos aquí

Solución al problema 2:

Primer ejercicio:

Estuvo complejo el ejercicio mas que nada por la cantidad de datos, de hecho mi solución solo es aproximada, y bueno estos son mis datos:

Y la temperatura a la que los 3 procesadores trabajan al 100% (126.94) no rebasa la temperatura limite de 150:

Saludos 😃

  • Ejercicio 1
def p(x):
  long=len(x)
  ret= x[long-1] - x [0]
  return ret

v_a = np.array([1,9,12])
v_b = np.array([4,3,4])
x ,y = 1 , 9
print('p(x*v_a + y*v_b) = ',p(x*v_a + y*v_b))
print('x*f(v_a) + y*f(v_b) =',x*p(v_a) + y*p(v_b))

#output
p(x*v_a + y*v_b) =  11
x*f(v_a) + y*f(v_b) = 11

Por lo tanto si es lineal

  • Ejercicio 2
#funcion
def f_4(x):
    res = x[2] + (x [2] - x [1])
    return res
# main 
v_a = np.array([1,9,12,2])
v_b = np.array([4,3,4,9])
x ,y = 1 , 9
print('p(x*v_a + y*v_b) = ',f_4(x*v_a + y*v_b))
print('x*f(v_a) + y*f(v_b) =',x*f_4(v_a) + y*f_4(v_b))

#output
p(x*v_a + y*v_b) =  60
x*f(v_a) + y*f(v_b) = 60

La segunda función es lineal

¿Que temperatura se alcanza?
Para resolver esta pregunta tenemos que encontrar el vector a y el escalar b que satisfacen la ecuación: T( P ) = aT . P + b El procedimiento es plantear y resolver el siguiente sistema de ecuaciones lineales donde a0, a1 y a2 son las componentes del vector a encontrar:
35 = 10 a0 + 10 a1 + 10 a2 + b
60 = 100 a0 + 10 a1 + 10 a2 + b
75 = 10 a0 + 100 a1 + 10 a2 + b
65 = 10 a0 + 10 a1 + 100 a2 + b
El vector resultante sería a = [5/18, 4/9, 1/3] y el escalar b = 220/9, de esta manera la ecuación del problema sería esta: T( P ) = [5/18, 4/9, 1/3]T . [P0, P1, P2] + 220/9. La máxima potencia de cada procesador es 100 por lo que P = [100, 100, 100], al resolver la ecuación T( P ) = [5/18, 4/9, 1/3]T . [100, 100, 100] + 220/9 el resultado de la temperatura es 130.
.
¿Cual es la potencia máxima que pueden alcanzar los procesadores para que T <= 150?
Reescribamos la ecuación T( P ) = [5/18, 4/9, 1/3]T . [P0, P1, P2] + 220/9:
150 = [5/18, 4/9, 1/3]T . [P0, P1, P2] + 220/9
150 = 5/18 P0 + 4/9 P1 + 1/3 P2 + 220/9
150 = 5/18 P0 + 8/18 P1 + 6/18 P2 + 440/18
150 = (5 P0 + 8 P1 + 6 P2 + 440)/18
2700 = 5 P0 + 8 P1 + 6 P2 + 440
2260 = 5 P0 + 8 P1 + 6 P2
La potencia máxima puede ser descrita como una ecuación de dos variables donde las variables independientes serán la potencia de dos de los tres procesadores y la variable dependiente nos indicará la potencia máxima del procesador restante. Para hallar la potencia máxima se puede utilizar cualquiera de las siguientes tres ecuaciones:
P0max = ( 2260 - 8 P1 - 6 P2 )/5
P1max = ( 2260 - 5 P0 - 6 P2 )/8
P2max = ( 2260 - 5 P0 - 8 P1 )/6

Por si alguien no entendió bien los dos puntos del Ejercicio:
En el primero, la propiedad de homogeneidad, por ende es lineal.
En el segundo, se cumple superposición porque la suma de los escalares (los indices del vector) es 1.

Esta fue la aproximación que encontré, la A transpuesta está definida en la función.


import numpy as np

def T(p):
    return np.array([112275/405449, 179925/405449, 134825/405449]).T@p + 24.468

print("Cuando están en reposo T=", T(np.array([10,10,10])),
      "\nCuando el procesador 1 está al máximo T=", T(np.array([100,10,10])),
      "\nCuando el procesador 2 está al máximo T=", T(np.array([10,100,10])),
      "\nCuando el procesador 3 está al máximo T=", T(np.array([10,10,100])),
      "\nCuando el todos los procesadores están al máximo T=", T(np.array([100,100,100])))

OUTPUT

Cuando están en reposo T= 35.00015077605322 
Cuando el procesador 1 está al máximo T= 59.922520790530996 
Cuando el procesador 2 está al máximo T= 74.9392059963152 
Cuando el procesador 3 está al máximo T= 64.9280825257924 
Cuando el todos los procesadores están al máximo T= 129.78950776053216

Este es el código que use para encontrar el vector a

Estas fueron las operaciones que use para enontrar los valores de el vector a

import numpy as np
T = np.array([35, 60, 75, 65]).T
P = np.array([[10, 100, 10, 10],[10, 10, 100, 10],[10, 10, 10, 100],[1,1,1,1]])
P_inv= np.linalg.inv(P)
a_vec = T @ P_inv
print(a_vec)	

Esta es la función que hice

def funcion_de_temperatura(x):
  return f'T = {a @ x+ b} con P_1 = {x[0]}, P2= {x[1]}, P3 = {x[2]} '
#Para probar
v = np.array([10,10,10])
print(funcion_de_temperatura(v))
#Temperatura maxima potencia
max_p = np.array([100, 100 ,100])
print(funcion_de_temperatura(max_p))

Y el output

T = 35.00000000000001 con P_1 = 10, P2= 10, P3 = 10 
T = 130.0 con P_1 = 100, P2= 100, P3 = 100 

Con este algoritmo calcule los valores donde se aproximaba a 150
Primero puse una delta grande de .01 y después que ya sabia que era cercano a 18 empecé a contar desde 18

resultado = 0
potencia = 118
delta = 0.000001
while (1):
  v_c = np.array([potencia,potencia,potencia])
  resultado = funcion_de_temperatura_n(v_c)
  if resultado ==150 or resultado > 150:
    break
  potencia = potencia + delta
print(resultado , potencia)

output : 150 , 118.94736899760812
Ejecuntando lo

max_p = np.array([118.94736899760812, 118.94736899760812,118.94736899760812])
print(funcion_de_temperatura(max_p))

Output

T = 150.00000060858633 con P_1 = 118.94736899760812, P2= 118.94736899760812, P3 = 118.94736899760812 

aqui les compartto mi codigo final:

import numpy as np
from sklearn.linear_model import LinearRegression

def datos_experimentales():
    p_0=np.array([10,10,10]) #en reposo
    p_1=np.array([100,10,10])
    p_2=np.array([10,100,10])
    p_3=np.array([10,10,100])
    
    p=np.array([p_0,p_1,p_2,p_3])
    t=np.array([35,60,75,65])
    
    return p, t

def solucion_metodo1(): #resolvinedo el sistema de ecuaciones
    ecuacion1="10*a0+10*a1+10*a2+b=35"
    ecuacion2="100*a0+10*a1+10*a2+b=60"
    ecuacion3="10*a0+100*a1+10*a2+b=70"
    ecuacion4="10*a0+10*a1+100*a2+b=65"
    
    p=np.array([[10,10,10,1],[100,10,10,1],[10,100,10,1],[10,10,100,1]]) #matrix de coeficientes, potencias de los controladores
    t=np.array([35,60,70,65]) #matriz de soluciones, temperaturas
    
    a=np.linalg.solve(p,t) #obtengo los valores de a y b
    return a

def solucion_metodo2(): #usando minimos cuadrados, numpy.linalg.lstsq
    # Experimental data:
    p,t=datos_experimentales()
    
    A = np.column_stack([p, np.ones(len(p))])
    coefs = np.linalg.lstsq(A, t, rcond=-1)[0]
    
    return coefs

def solucion_metodo3(): #regresion lineal con sklearn.linear_model
    # Experimental data:
    p,t=datos_experimentales()
    
    #primera forma:
    model = LinearRegression()

    model.fit(X=p, y=t)

    # print("coeff: ", *model.coef_)
    # print("intercept: ", model.intercept_)
    
    #segunda forma:
    reg = LinearRegression().fit(p, t)
    # print (reg.coef_, reg.intercept_)
    
    return reg.coef_, reg.intercept_
    
def T(p):
    a,b=solucion_metodo3()
    return a@p+b

    
def run():
    print("********metodo1, resolvinedo el sistema de ecuaciones*******")
    print(solucion_metodo1())
    print("")
    print("********metodo2, usando minimos cuadrados, numpy.linalg.lstsq*******")
    print(solucion_metodo2())
    print("")
    print("********metodo3, regresion lineal con sklearn.linear_model*******")
    print("coeff, intercept: ", solucion_metodo3())
    print("")
    
    p_max_capacity=np.array([100,100,100])
    print(f'la temperatura que se alcanza cuando los todos los procesadores estan a su maxima capacidad es de {T(p_max_capacity)}°C')

Output:

Siendo la temperatura de fusión de los procesadores 150°C, los 3 podrían operar a su máxima capacidad sin que se derritan

Así fue como resolví los primeros 2 ejercicios, con ejemplos. Estoy abierto a feedback (:

Para el tercer ejercicio tuve que ver ejemplos de algunos comentarios y noté que iba en la misma dirección, dejo mi código en python:

import numpy as np
P = np.array([[10,10,10,1] , [100,10,10,1] , [10,100,10,1] , [10,10,100,1]])
T = np.array([35,60,75,65])
x = np.linalg.solve(P,T)
print(f"La solución para el sistema de ecuaciones lineales es {x}")

Resultado: La solución para el sistema de ecuaciones lineales es [ 0.27777778 0.44444444 0.33333333 24.44444444]

Otra solución, por el gusanito de estar mas aproximada,

Estoy realmente muy contento de decirle que pude resolver el problema. Tardé unas horas, pero me ha apasionado resolverlo. Me sirvió mucho retomar otros cursos, fundamentalmente el otro que hay sobre Algebra Lineal donde nos enseñan a resolver un sistema de ecuaciones lineales usando matrices y vectores. Gracias a este ejercicio termine de entender su utilidad.

Les dejo mi trabajo final:

https://github.com/Mgobeaalcoba/proyectos_platzi/blob/main/Ejercicios_de_Funciones_Lineales.ipynb

import numpy as np
import sympy as sym
#en reposo
p_0=np.array([10,10,10,1]) 
#1 activado
p_1=np.array([100,10,10,1])
#2 activado
p_2=np.array([10,100,10,1])
#3 activado
p_3=np.array([10,10,100,1])

#coeficientes de la matriz
coef=np.array([p_0,p_1,p_2,p_3])
#soluciones
sol=np.array([35,60,75,65])
#solucionamos el sistema de ecuaciones
a=np.linalg.solve(coef,sol)

#miramos cuando la temperatura es igual a 150 
x = sym.symbols('x')
expr =a[0]*x+a[1]*x+a[2]*x+(a[3])-150
print(f'la potencia maxima que pueden alcanzar antes de que la temperatura sea superior a 150° es: {sym.solve(expr)[0]}')
#miramos la temperatura con los 3 procesadores funcionando
print(f'la temperatura con todos los procesadores encendidos es: {a[0]*100+a[1]*100+a[2]*100+(a[3])}°')

la potencia maxima que pueden alcanzar antes de que la temperatura sea superior a 150° es: 118.947368421053
la temperatura con todos los procesadores encendidos es: 130.0°

<> import numpy as np vectorA = np.array(\[5/18,4/9, 1/3]) bias = 24.4444444444 def T(vectorA, bias = 24.4444444444): P0 = float(input("p0 = ")) P1 = float(input("p1 = ")) P2 = float(input("p2 = ")) vectorP = np.array(\[P0,P1,P2]) return [email protected] + bias T(vectorA, bias = 24.4444444444)
## Ejercicios Resueltos 1. Probar que las siguientes funciones sean lineales ![](https://static.platzi.com/media/user_upload/Untitled%20%2820%29-5b0a5464-410b-4d57-a327-89218fca3209.jpg) ```python # Definimos la funcion def f(x): return x[-1] - x[0] ``` ```js # elementos a utilizar a = np.array([1,1,1,1]) b = np.array([1,0,1,0]) x,y = 1,-2 ``` ```python # principio de superposicion print('f(a*x + b*y) = ', f(a*x + b*y)) --> f(a*x + b*y) = 2 ``` ```js # principio de superposicion print('x*f(a) + y*f(b) = ', x*f(a) + y*f(b)) --> x*f(a) + y*f(b) = 2 ``` Como ambos resultados son correctos, la funcion f(x) es lineal ![](https://static.platzi.com/media/user_upload/Untitled%20%2821%29-55c381eb-c8e7-4ed6-be95-8b2c24345b8d.jpg) ```python # definimos la funcion def f4(x): return x[3] + (x[3] - x[2]) ``` ```python # elementos a utilizar a = np.array([0,1,1,0]) b = np.array([1,0,1,0]) x,y = 1,-2 ``` ```js # principio de superposicion print('f(a*x + b*y) = ', f4(a*x + b*y)) --> f(a*x + b*y) = 1 ``` ```python # principio de superposicion print('f(a*x + b*y) = ', f4(a*x + b*y)) --> f(a*x + b*y) = 1 ```Como ambos resultado son iguales indica que cumple con el principio de superposición, por tanto, es lineal. 1. Resolver: ![](https://static.platzi.com/media/user_upload/Untitled%20%2822%29-f13d1189-a340-4aea-9069-ce082732a753.jpg) ![](https://static.platzi.com/media/user_upload/Untitled%20%2823%29-984ceeb2-c8c0-4fc4-b644-dd523babff37.jpg) ```python # construimos una matriz con los coeficientes del sistema de ecuacion A = np.array([[10,10,10,1], [100,10,10,1], [10,100,10,1], [10,10,100,1]]) # vector con las soluciones del sistema de ecuacion b = np.array([35,60,75,65]) # vectos solucion. Primer parametro la matriz, segundo parametro las soluciones a = np.linalg.solve(A,b) # los primeros 3 elementos corresponden a los coeficientes de 'a^T' # el ultimo elemento corresponde a 'b' a --> array([ 0.27777778, 0.44444444, 0.33333333, 24.44444444]) ``` ```python # asignamos los elementos de la lista 'a' a nuevas variables b = a[3] a = a[:3] print(a) print(b) --> [0.27777778 0.44444444 0.33333333] 24.444444444444443 ``` ```python # ahora, definimos una funcion que resuma la formula anterior def T(P): return a.dot(P) + b ``` ```python # Validamos que los resultados encontrados sean correctos al pasarlos # a la formula y ver que las soluciones sean las mismas print('T([10,10,10]) = ',T(np.array([10,10,10]))) print('T([100,10,10]) = ',T(np.array([100,10,10]))) print('T([10,100,10]) = ',T(np.array([10,100,10]))) print('T([10,10,100]) = ',T(np.array([10,10,100]))) --> T([10,10,10]) = 35.0 T([100,10,10]) = 60.0 T([10,100,10]) = 75.0 T([10,10,100]) = 65.0 ``` Supongamos que los tres procesadores operan a máxima potencia ¿Qué temperatura se alcanza? ```python print('T([100,100,100]) = ', a.dot(np.array([100,100,100])) + b) --> T([100,100,100]) = 130.0 ``` La temperatura de fusión de los procesadores (a la que los procesadores se derriten) es cerca de 150 ¿Cuál es la potencia máxima que pueden alcanzar los procesadores para que T≤150? ```python # Asumimos que la temperatura maxima de los 3 procesadores # es la misma con una tolerancia es de 0.01 y que la potencia minima es de 100 tol = 0.01 min = float(100) max = 150 ``` ```python # definimos la potencia de inicio P = np.array([min,min,min]) # buscamos los valores de Potencia que no superen los 150 de temperatura while T(P) <= max: max_potencia = P P += tol max_potencia --> array([118.95, 118.95, 118.95]) ```

Método simplificado para el problema de los procesadores:
.

Una función afín cumplirá la superposición si y solo si la suma de de los coeficientes de la combinación lineal es uno. Es decir, si f es una función afín entonces f(αx+βy)=αf(x)+βf(y) si y solo si α+β=1 .

.
En este caso tenemos la función T( P), que puede expresarse como T(1*P), donde 1 es el único coeficiente de la función T.
Como sólo hay un coeficiente (que equivale a 1), entonces la suma de coeficientes es igual a 1.
Como la suma de coeficientes es igual a 1, podemos aplicar el principio de superposición.
.

If input A produces response X and input B produces response Y then input (A + B) produces response (X + Y).

.
Por lo que podemos calcular el efecto en la temperatura producido por cada procesador por separado y sumarlos para hallar el efecto total en el sistema:
.
T(P1) = 60° - 35° = 25°
T(P2) = 75° - 35° = 40°
T(P3) = 65° - 35° = 30°
T( P) = T(P1) + T(P2) + T(P3) = 95°
.
Ya teniendo el efecto total de los procesadores en la temperatura del sistema, sólo debemos sumarlo a la condición inicial T = 35°:
.
Tmax = 95° + 35°
Tmax = 130°
.
Finalmente, podemos concluir que:
.

  • Si los procesadores operan a máxima potencia, el sistema tendría una temperatura de 130°
  • No hay riesgo de que los procesadores se derritan si operan a máxima potencia, ya que 130° < 150°

Tenemos un sistema de ecuaciones lineales de 4x4, el cual podemos resolver mediante la libreria numpy.linalg.solve Documentacion

De la sigueinte manera:

Agregamos los arrays en numpy

a = np.array([[10, 10, 10, 1],[100, 10, 10, 1],[10,100,10,1],[10,10,100,1]])
b = np.array([35,60,75,65])

Ejucutamos np.linalg.solve e imprimos el resultado

x=np.linalg.solve(a,b)
print(x)

Obteniendo los sigueintes coeficientes
0.27777778 0.44444444 0.33333333 24.44444444]

Con esta información, creamos una función en python que representa la funcion de Temperatura§ $$T§ = a^{T} P+b$$

def Temperatura(x: np.array):
 a =np.array([0.27777778,0.44444444,0.33333333])
 b = 24.444444
 return np.dot(x,a)+b

Finalmente, obtenemos
Temperatura(np.array([100,100,100]))
130

Cuando los tres procesadores están en reposo: PT = [101010], T = 35.
Cuando el primer procesador opera a potencia absoluta: PT = [1001010], T = 60.
Cuando el segundo procesador opera a su máxima capacidad: PT = [1010010], T = 75.
Cuando el tercer procesador opera a máxima potencia mientras los otros dos están en reposo: PT = [1010100], T = 65.
Podemos escribir estas ecuaciones en forma matricial:

A * P + B = T

Donde:
A = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
P = [[P0], [P1], [P2]]
B = [[10], [10], [10]]
T = [[35], [60], [75]]
  • Para encontrar los coeficientes a y b, resolvemos el sistema de ecuaciones lineales. La solución se obtiene multiplicando la inversa de A por (T - B):
P = inv(A) * (T - B)
  • Luego, podemos calcular la temperatura cuando los tres procesadores operan a máxima potencia (PT = [111111]) utilizando la relación lineal encontrada:
T_max = a * [1, 1, 1] + b

Finalmente, podemos calcular la potencia máxima que pueden alcanzar los procesadores para que T ≤ 150:

P_max = (150 - b) / a

Codigo

import numpy as np

# Matrices y vectores
A = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]])
P = np.array([[1], [1], [1]])
B = np.array([[10], [10], [10]])
T = np.array([[35], [60], [75]])

# Cálculo de los coeficientes a y b
a = np.linalg.inv(A) @ (T - B)
b = T - a

# Potencia máxima cuando los tres procesadores operan a máxima potencia
PT_max = np.array([[1], [1], [1]])
T_max = a.T @ PT_max + b

# Potencia máxima para T ≤ 150
P_max = (150 - b) / a

# Imprimir resultados
print("Coeficientes a y b:")
print("a =", a)
print("b =", b)
print("Temperatura cuando los tres procesadores operan a máxima potencia:")
print("T_max =", T_max)
print("Potencia máxima para T ≤ 150:")
print("P_max =", P_max)

La salida del programa mostrará los coeficientes a y b, la temperatura cuando los tres procesadores operan a máxima potencia (T_max) y la potencia máxima que pueden alcanzar los procesadores para que T ≤ 150 (P_max).

Les dejo mi solución:

import numpy as np
A=np.array([[100,10,10],[10,100,10],[10,10,100]])
b=np.array([60,65,75])
A_inv = np.linalg.inv(A)
x=np.linalg.solve(A,b)
print("Por solve: ",np.linalg.solve(A,b))
print("por inversa: ",A_inv.dot(b))
#Obtenemos la temp max con los 3 cores al 100
print("Temperatura max 3 cores al 100: ",x.T.dot(np.array([100,100,100])))
#Obtenemos la potencia máx para mantener una temp menor o igual a 150 suponiendo la misma potencia en los 3
print("potencia máxima para los tres: ",150/np.sum(x))
Por solve:  [0.48148148 0.53703704 0.64814815]
por inversa:  [0.48148148 0.53703704 0.64814815]
Temperatura max 3 cores al 100:  166.66666666666666
potencia máxima para los tres:  90.00000000000001

Tuve que ir a leer e investigar un poco de regresión en python y lo logré :3

import numpy as np
A = np.array([
[10,10,10, 1],
[100,10, 10, 1],
[10, 100, 10, 1],
[10, 10, 100, 1]])
B = np.array([35, 60, 75, 65])
X = np.linalg.inv(A).dot(B)

Los coeficientes que siguen son las respuestas del problema y el valor de b:

array([ 0.27777778,  0.44444444,  0.33333333, 24.44444444])

Link de mi Notebook
EJERCICIO 1

x = np.array([1,1,1,1])
y = np.array([1,0,1,0])
a,b = 1,-2

def e(x):
  return x[-1] - x[0]

# Code para testear la primera funcion:
print('e(a*x + b*y) = ', e(a*x + b*y))
print('a*e(x) + b*e(y) = ', a*e(x) + b*e(y))
# Esta funcion es lineal.

OUTPUT

e(a*x + b*y) =  2
a*e(x) + b*e(y) =  2
def rara(x):
  return x[3] + (x[3] - x[2])

# Code para testear la segunda funcion:
print('rara(a*x + b*y) = ', rara(a*x + b*y))
print('a*rara(x) + b*e(y) = ', a*rara(x) + b*rara(y))
# Esta funcion es lineal.

OUTPUT

rara(a*x + b*y) =  3
a*rara(x) + b*e(y) =  3

PROBLEMA

# Calculando los pesos, solucionando el sistema de ecuaciones
p_sistem = np.array([10, 10, 10, 1, 100, 10, 10,1, 10, 100, 10, 1, 10, 10, 100, 1]).reshape(4,4)
print("** Sistema de ecuaciones P **\n")
print(p_sistem)
print("\n** Vector T**\n")
t_sistem = np.array([35,60, 75, 65])
print(t_sistem)

OUTPUT

** Sistema de ecuaciones P **

[[ 10  10  10   1]
 [100  10  10   1]
 [ 10 100  10   1]
 [ 10  10 100   1]]

** Vector T**

[35 60 75 65]
print("** Inversa del sistema de ecuaciones P**\n")
p_sistem_inv = np.linalg.inv(p_sistem)
print(p_sistem_inv)

Output

** Inversa del sistema de ecuaciones P**

[[-1.11111111e-02  1.11111111e-02 -1.38777878e-19  0.00000000e+00]
 [-1.11111111e-02  0.00000000e+00  1.11111111e-02  0.00000000e+00]
 [-1.11111111e-02  0.00000000e+00  0.00000000e+00  1.11111111e-02]
 [ 1.33333333e+00 -1.11111111e-01 -1.11111111e-01 -1.11111111e-01]] 
# calculando los pesos de los 3 cores y el b (bias or offset)
p_cores = p_sistem_inv.dot(t_sistem)
p_cores

Output

array([ 0.27777778,  0.44444444,  0.33333333, 24.44444444])
def T(p_vector):
  return p_cores[:3].dot(p_vector) + p_cores[-1]

print(T([100,10,10]))
print(T([10,10,100]))
print(T([10,100,10]))

Output

60.000000000000014
65.0
75.00000000000001
# Supongamos que los tres procesadores operan a máxima potencia ¿Qué temperatura se alcanza?
print(f'Temperatura en T([100,100,100] = {T([100,100,100])}')

Output

Temperatura en T([100,100,100] = 130.0
# ¿Cuál es la potencia máxima que pueden alcanzar los procesadores para que T≤150?
potencia = np.array([0,0,0])
temperatura = T(potencia)
precision = 0.0001

while temperatura <= 150:
  potencia = potencia + precision
  temperatura = T(potencia)
 
print(f'Potencia Máxima: [{potencia}]')
print(f'Temperatura : [{temperatura}]')

output

Potencia Máxima: [[118.9474 118.9474 118.9474]]
Temperatura : [150.0000333363154]
# Una solución exacta!!!
from sympy import *
from sympy import MatrixSymbol
A=Matrix([[10,10,10,1],[100,10,10,1],[10,100,10,1],[10,10,100,1]])
print("Respuesta primera pregunta: ", (((A**(-1)*Matrix([35,60,75,65])).T)*Matrix([100,100,100,1]))[0],'\n' "Respuesta segunda pregunta: ", (150-(A**(-1)*Matrix([35,60,75,65]))[3])/(((Matrix([1,1,1,0]).T)*(A**(-1)*Matrix([35,60,75,65])))[0]))

Ejercicios 1 y 2.

Buenas noches se realiza la solución solicitada:

Pude resolver ambos ejercicios, aunque me hubiese gustado resolver el 2ndo con lo aprendido en este curso, pero no fue suficiente para mi gusto 😞 . Lo resolví usando matrices.

Ejercicio 1

def f_1(x):
    return x[len(x)-1] - x[0]

x = np.array([1,2,3,4,5])
y = np.array([7,8,9,10,11])
alpha = -2
beta = 1

f_1(alpha*x + beta*y) == alpha * f_1(x) + beta * f_1(y)

True

.
Entonces es una función lineal
.
.
.
.

Ejercicio 2

def f_2(x):
    return np.array([1, 0, -1, 1])@x

x = np.array([1,9,12,2])
y = np.array([4,3,4,9])
alpha = 1
alpha = 9

f_2(alpha*x + beta*y) == alpha*f_2(x) + beta*f(y)

True

.
Entonces esta tambien es una función lineal

La solución al ejercicio 3 propuesto en la clase:


El link de la clase de Platzi que utilice para resolver el ejercicio con python fue el siguiente:
https://platzi.com/clases/1725-algebra-lineal/23877-aplicacion-de-la-inversa-de-una-matriz-para-resolv/

El código implementado para resolver los problemas planteados fue el siguiente:

En el caso de resolver el sistema de ecuaciones:

import numpy as np

np.set_printoptions(suppress=True)

A = np.array([[10,10,10,1],[100,10,10,1],[10,100,10,1],[10,10,100,1]])
b = np.array([[35],[60],[75],[65]])
inversa_A = np.linalg.inv(A)
x = inversa_A.dot(b)
print(x)

Código para comprobar que el resultado sea el correcto:

print(A.dot(x))

Código para responder la pregunta referente a la temperatura generara por los tres procesadores a su máximo potencial:

a= np.array([[0.27777778],
 [0.44444444],
 [0.33333333]])

P= np.array([100,100,100])

b= 24.44444444

temperatura= a.T.dot(P)+b

print(temperatura)

Ejercicio 1:

y:

Ambas funciones son lineales ya que se cumple en cada una la propiedad de superposición.

Mi solución:

import numpy as np

A=np.array([[10,10,10,1], [100,10,10,1],[10,100,10,1],[10,10,100,1]])
b = np.array([35, 60,75,65])

a = np.linalg.solve(A,b)

print('solution for b: ', a[3], '\nsolution for all a^T variables: ', a[:3] ) 

Ejercicio 1:

Rpta.: Sí, es lineal.

Ejercicio 2:

Rpta.: Sí, es lineal

Dejo las soluciones en el notebook de mi github, agradezco un star en el github, y un me gusta en este sistema de comentarios, me ayudaría bastante.

Buenos días, finalmente pude realizar mi ejercicio gracias a lo que realizaron mis compañeros. Los ejercicios no se me hicieron complicados y los hice en mi libreta.

El problema fue lo complicado porque no sabía exactamente que tenía que hacer hasta que vi los ejercicios de mis compañeros y ví que tenía que resolver un sistema de ecuaciones. En el caso de cual sería la potencia máxima no sabía como responderlo porque era una ecuación de 3 incognitas la que estaba manejando, pero después ví que un compañero solo utilizó una y con eso se me facilito el ejercicio.
Anexo una imagen de como resolvi la última ecuación.

Y finalmente anexo mi archivo de Deepnote para que puedan visualizar que es lo que hice en Jupyter Notebook.

Yo solucioné el problema 2 con el método Singular Value Decomposition que les recomiendo bastante investiguen que es bastante útil para hacer regresiones etc… La solución al caso de los tres P al máximo que es 100 da 130 de temperatura y para el ultimo donde se quiere saber los P para que de 150 la temperatura el conjunto de soluciones que encontré esta en la variable sol2 y para poder llegar a 150 se debe superar el máximo de P que nos establece el ejercicio 100.

import numpy as np

A = np.array([
    [10, 10, 10, 1, -35],
    [100, 10, 10, 1, -60],
    [10, 100, 10, 1, -75],
    [10, 10, 100, 1, -65]
])

_, _, V = np.linalg.svd(A)
V = V.transpose()
a = V[:, -1] / V[-1, -1]

# Solucionando el caso donde los tres P son igual a 100
P = 100
sol1 = a[0] * P + a[1] * P + a[2] * P + a[3]


x = np.linspace(100, 150, 400)
y = np.linspace(100, 150, 400)
z = np.linspace(100, 150, 400)

X, Y, Z = np.meshgrid(x, y, z)
error = 150 - (a[0] * X + a[1] * Y + a[2] * Z + a[3])

sol2 = np.where(np.abs(error) < 0.01)
sol2 = np.array([X[sol2],Y[sol2],Z[sol2]])

Resolución de tercer ejercicio con pasos:

  • Primero planteamos el sistema de ecuaciones

      a0x10+a1x10+a2x10+b=35
      a0x100+a1x10+a2x10+b=60
      a0x10+a1x100+a2x10+b=75
      a0x10+a1x10+a2x100+b=65
    
  • Del planteo anterior podemos sacar la siguiente matriz:

      a0    a1    a2    b
    
      10    10    10    1  | 35
      100   10    10    1  | 60
      10    100   10    1  | 75
      10    10    100   1  | 65
    
  • Para resolver esto podemos emplear el método Gauss Jordán, este nos dice que haciendo operaciones entre las filas de la matriz tenemos que obtener la matriz identidad (una matriz donde su principal diagonal son unos y el resto ceros)

      1  0  0  0 
      0  1  0  0
      0  0  1  0
      0  0  0  1
    
  • Una vez aplicado el método Gauss Jordán nos queda la siguiente matriz:

      a0    a1    a2    b                  a0    a1    a2    b    
      				       |     |     |     |
      1     0     0     0  | 5/18 	       1 ----|-----|----->  | 5/18
      0     1     0     0  | 4/9 	       0 ----1-----|----->  | 4/9
      0     0     1     0  | 1/3 	       0     0     1----->  | 1/3
      0     0     0     1  | 220/9 	       0     0     0     1->| 220/9
    
  • Es con esto que nos quedan los escalares que vana a acompañar a cada uno de los valores de la ecuación. Ahora toca ver que los valores sean correctos, remplazando tenemos que:

      (5/18)x10+(4/9)x10+(1/3)x10+(220/9)=35
      (5/18)x100+(4/9)x10+(1/3)x10+(220/9)=60
      (5/18)x10+(4/9)x100+(1/3)x10+(220/9)=75
      (5/18)x10+(4/9)x10+(1/3)x100+(220/9)=65
    

Mi solución a la pregunta sobre la temperatura que alcanzará el cluster si los procesadores trabajan a 100 de potencia.

Comparto mi solución, Yo lo realice por medio del metodo de Gauss planteando una matriz que se adecuara al problema, escalonandola y sacando los valores de dichas variables

Si observas las variables de esta forma es sencillo llegar a la solución, me encanto esta clase ♥

Para solucionar el problema:

pt = np.array([[10,10,10,1],[100,10,10,1],[10,100,10,1],[10,10,100,1]])
t = np.array([35,60,75,65])
pt_inv = np.linalg.inv(pt.T)   # matriz inversa que pasa al otro lado
a_vec = t.dot(pt_inv)  # se calculan los coeficientes
print(a_vec) 

[ 0.27777778 0.44444444 0.33333333 24.44444444]

Procesadores a máx. potencia

y = a_vec.dot(np.array([100,  100,  100, 1]))

129.99
coeficientes para llegar a 150:

(150 - (1*a_vec[3]))/ sum(a_vec[0:3])

118.94

y = a_vec.dot(np.array([118.94,   118.94,   118.94, 1]))

149.99

Basándome en algunas soluciones de los compañeros, esta es la mía para encontrar el máximo sin sobrepasar la temperatura de 150

#Potencia maxima para que T <= 150

#Generando los vectores
rrr = np.array([10,10,10,1])
mrr = np.array([100,10,10,1])
rmr = np.array([10,100,10,1])
rrm = np.array([10,10,100,1])

#Generando la matriz a partir de los vectores
matriz = np.array([rrr, mrr, rmr, rrm])

#Generando el vector de temperaturas
temp = np.array([35, 60, 75, 65])

#Usando la funcion np.linalg.solve() para resolver el sistema de ecuaciones
solu = np.linalg.solve(matriz, temp)

#Obtenemos b
b = solu[3]

#Obtenemos los coeficientes
coef1 = solu[0]
coef2 = solu[1]
coef3 = solu[2]

#Partimos en 0 todos los valores
x = 0
y = 0
z = 0
max = 0

#Obtenemos todos los valores max, x, y, z
max_values = []
x_values = []
y_values = []
z_values = []

#Ciclo while para obtener el máximo a partir del sistema de ecuaciones resuelto
while max < 150:
  max = coef1*x + coef2*y + coef3*z + b
  max_values.append(max)
  x_values.append(x)
  y_values.append(y)
  z_values.append(z)

#Vamos sumando x, y, z de poco en poco para obtener un valor mas cercano a 150
  x += 0.1
  y += 0.1
  z += 0.1

#Imprimimos los valores x, y, z, como vectores, y max como la temperatura máxima.
#Sabiendo que max siempre sera mayor a 150 para romper el ciclo while.
#Accedemos al valor penultimo de los valores.
max_vector = [round(x_values[len(x_values)-2], 4), round(y_values[len(y_values)-2], 4), round(z_values[len(z_values)-2], 4)]
print(max_vector, ' = ', round(max_values[len(max_values)-2], 4))

Mi aporte con la solución del reto. Para el primer ejercicio realicé una función que verifica si una función (vaya la redundancia) es lineal o no. Esto lo hace comprobando el principio de superposición.

import random
import numpy as np

def f1(x):
    return x[-1]-x[0]

def f2(x):
    return x[3]+(x[3]-x[2])

def check_linear(f, n):
    """
    Check if a function f is linear by verifying the superposition principle.
    """
    a = random.randint(-n**2, n**2)
    b = random.randint(-n**2, n**2)
    x = np.array([])
    y = np.array([])
    for _ in range(n):
        x = np.append(x, random.randint(-n**2, n**2))
        y = np.append(y, random.randint(-n**2, n**2))
    if f(a*x+b*y) == a*f(x)+b*f(y):
        return "Linear function"
    else:
        return "Non-linear function"

# number of dimensions
n = 5
print("f(x) = x_n-1 - x_0 -> ", check_linear(f1, n))
print("f(x) = x_3 + (x_3 - x_2) ->", check_linear(f2, n))

Output:

f(x) = x_n-1 - x_0 ->  Linear function
f(x) = x_3 + (x_3 - x_2) -> Linear function

Para el segundo ejercicio opté por resolver el sistema de ecuaciones construido a partir de los datos empíricos.


Obteniendo la temperatura a potencia máxima:

Calculando la potencia máxima para la temperatura de fusión. En este caso se obtiene una expresión como resultado ya que la potencia máxima permitida de cada procesador dependerá de la potencia de los dos procesadores restantes.

Ejecicio
1.-

def h(x):
  return x[3] - x[0]

x = np.array([1,-1,1,1])
y = np.array([-1,1,1,1])
a,b = 1/2, 1/2
if h(x*a + y*b) == a*h(x) + b*h(y): 
  print('la función g es lineal')
else: 
  print('la función g no es lineal')

la función g es lineal
2.-

def j(x):
  return 2*x[3] - x[2]

if j(x*a + y*b) == a*j(x) + b*j(y): 
  print('la funcion g es lineal')
else: 
  print('la funcion g no es lineal')

la funcion g es lineal

Problema

def T(P):
  return np.array([5/18,4/9,1/3])@P + 220/9

p1 = np.array([10,10,10])
p2 = np.array([100,10,10])
p3 = np.array([10,100,10])
p4 = np.array([10,10,100])

print(T(p1))
print(T(p2))
print(T(p3))
print(T(p4))

35.0
60.0
75.0
65.0

P <= 118 para que T <= 150

Les dejo el enlace y capturas de mi solución:

Duda! Se podría tomar la función primera como función objetivo y la otra como una restricción y ¿resolver en algún punto derivando e igualando a 0 por Langrange?. Nada se me ocurre resolverlo de esa manera, pero las funciones no están muy claras jejeje

primer ejercicio:

import numpy as np
def superposicion(x,y,a,b):
    print('f(x*a + y*b) = ',f(x*a + y*b))
    print('x*f(a) + y*f(b) =',x*f(a) + y*f(b))

def f(x):
    return x[-1-1]-x[0]

a=np.array([1,5,-4])
b=np.array([2,2,-1])
x,y=2,-4

superposicion(x,y,a,b)

output:

Si es lineal.

Segundo ejercicio:

import numpy as np
def superposicion(x,y,a,b):
    print('f(x*a + y*b) = ',g(x*a + y*b))
    print('x*f(a) + y*f(b) =',x*g(a) + y*g(b))

def g(x):
    return x[3]+(x[3]-x[2])

a=np.array([1,5,-4,2])
b=np.array([2,2,-1,-7])
x,y=2,-4

superposicion(x,y,a,b)

Output:

también es lineal
Aun estoy terminand el ultimo problema

Les comparto mi solución

# %% [markdown]
# ## Ejercicio: Determina si las siguientes funciones son lineales o no
# %% [markdown]
# * $f(\mathbf{x}) = x_{n-1} - x_{0}$
# 
# * Si $\mathbf{x}\in\mathbb{R}^{4}$ y $f:\mathbb{R}^{4} \to \mathbb{R}$ definida como $f(\mathbf{x})=x_{3}+(x_{3}-x_{2})$

# %%
x = np.random.rand(np.random.randint(100))
y = np.random.rand(x.size)
a = 10
b = 42

def f1(vector):
    return vector[-1] - vector[0]


# %%
print('Function(a*x + b*y) = ', f1(a*x + b*y))
print('a*Function(x) + b*Function(y) = ', a*f1(x) + b*f1(y))
# La función es lineal


# %%
x = np.random.rand(4)
y = np.random.rand(4)
a = np.random.randint(100)
b = np.random.randint(100)

def f2(vector):
    return vector[2] + (vector[2]-vector[1])


# %%
print('Function(a*x + b*y) = ', f2(a*x + b*y))
print('a*Function(x) + b*Function(y) = ', a*f2(x) + b*f2(y))
# La función es lineal


# %%


# %% [markdown]
# ## Problema: Potencia en un clúster de procesadores y temperatura

# %%
# Datos
P1 = np.array([10,10,10])
P2 = np.array([100,10,10])
P3 = np.array([10,100,10])
P4 = np.array([10,10,100])
T1 = 35
T2 = 60
T3 = 75
T4 = 65


# %%
# Sitema de ecuaciones lineales mediante matrices
# P matriz de coeficientes, 3 primeros números vector a y ultimo número valor del bias b

P = np.array(
[[10, 10, 10, 1],
[100,10,10, 1],
[10,100,10, 1],
[10, 10, 100, 1]])
T = np.array([T1, T2,T3, T4])


# %%
a = np.linalg.solve(P,T)[0:3]
b = np.linalg.solve(P,T)[3]
a, b
# (array([0.27777778, 0.44444444, 0.33333333]), 24.444444444444443)


# %%
def temperature(P):
    return a.T@P+b
T1_solution = temperature(P1)
T2_solution = temperature(P2)
T3_solution = temperature(P3)
T4_solution = temperature(P4)

T_solution = np.array((T1_solution,T2_solution,T3_solution,T4_solution))
T_solution
# array([35., 60., 75., 65.])


# %%
# Solución mediante lstsq
np.linalg.lstsq(P,T,rcond=None)[0]
# array([ 0.27777778,  0.44444444,  0.33333333, 24.44444444])

# %% [markdown]
# * Temperatura máxima

# %%
# Temperatura a máxima potencia
T_máxima = temperature([100,100,100])
T_máxima
# 130.0


# %%
# La temperatua máxima que se puede alcanzar es de 130

# %% [markdown]
# * Potencia para que los procesadores alcancen una temperatura de 150

# %%
from sklearn.linear_model import LinearRegression
model = LinearRegression()


# %%
T = T.reshape(-1,1)


# %%
model.fit(T,P)


# %%
print("coeff: ", *model.coef_)
print("intercept: ", model.intercept_)
# coeff:  [0.1294964] [1.68345324] [0.64748201] [0.]
# intercept:  [ 24.89208633 -66.4028777   -5.53956835   1.        ]

# Pares x + b, para cada una de las 4 salidas


# %%
P_150 = model.predict([[150]])[0][:-1]
P_150 
# array([ 44.31654676, 186.11510791,  91.58273381])


# %%
# Comprobación de temperatura con el vector de la potencia encontrada de los procesadores
T_150 = temperature(P_150)
T_150

# %% [markdown]
# * ¿Cuál es la potencia minima para alcanzar 150 de Temperatura?

# %%
P = 100
T = temperature([P,P,P])

while (T < 150):
    tol = 0.0001
    P += tol
    T = temperature([P,P,P])
print(P,T)
# 118.94740000062899 150.00003333399727

Aquí mi respuesta al Problema Final , intenté ser lo más específico posible y detallado en los términos matemáticos.

La temperatura alcanzada es 130

import numpy as np

s = np.array([[10, 10, 10, 1], [100, 10, 10, 1], [10, 100, 10, 1], [10, 10, 100, 1]])
T = np.array([[35], [60], [75], [65]])

a = (np.linalg.inv(s)).dot(T)
b = float(a[3][0])
c = a[:][:3]
p = np.array([[100,100,100]])
T_full = (c.T).dot(p.T) + b
print(T_full)	 

Lo tengo resuelto en papel, pueden copiar y pegar el enlace. Espero les sirva.
https://drive.google.com/file/d/1yH9ZxKPXpmELnzbZEB_9iXt04RrReoV1/view?usp=sharing

Hoy aprendí a utilizar la función np.linalg a partir de los aportes y noté que da una aproximación bastante considerable respecto los resultados dados.
Para comprobarlo de otra forma, fui a una calculadora en línea e ingrese la matriz para resolver de la forma escalonada reducida por filas, el resultado fue Po=5/18 P1=4/9 P2=1/3 b=220/9
Con esos coeficientes nos regresa los resultados exactos y la temperatura cuando se trabaja a máxima potencia es de 130

Quizas estoy entendiendo mal, pero la primera solución q se me vino a la mente es esta:
reposo = [10,10,10] #35
primer_pro = [100,10,10] #60 #25
segun_pro = [10,100,10] #75 #40
tercer_pro = [10,10,100] #65 #30
(la segunda columna es la diferencia entre el reposo (35) y la temperatura q levantó
25+40+30+35 = 130 #maxima potencia
Hay algun error en esto?

def a(x): # por que me da flojera escribir...
    return np.array(x)
independientes=a([35,60,75,65])
matriz=a([[10,10,10,1],
        [100,10,10,1],
        [10,100,10,1],
        [10,10,100,1]])

soln=np.linalg.solve(mat, independientes)
print(soln,"temp max: ",100*soln[:-1].sum()+soln[-1])```