Maison > Article > développement back-end > Python implémente divers algorithmes d'optimisation
Recommandations d'apprentissage gratuites associées : Tutoriel vidéo Python
Pour plus de détails sur la fonction, voir rres Ce code fait exécuter l'algorithme deux fois
def asdf(x): rres=8*x**3-2*x**2-7*x+3 return rres i=2 left=0 right=1 while i>0 : i = i-1 ans = 0.1 mid1 = (left + right + ans) / 2 mid2 = (left + right - ans) / 2 a=asdf(mid1) c=asdf(mid2) if a > c : right = mid1 else : left = mid2 b=(left+right) / 2 print("左极限=%s,右极限=%s,极小值x=%s"%(left,right,b))rrreeMatériel :
C'est le premier code que j'ai implémenté. Après avoir appris l'algorithme, le cadre logique est fondamentalement là, et la seule chose qui doit être clarifiée est le langage python correspondant. J'ai donc commencé à chercher "comment définir une fonction" (voir Youku de mofan pour plus de détails), le format du "corps de la boucle" et "l'instruction conditionnelle if" (https://blog.csdn.net/qq_39407518/article/details/ 79822498) "Symboles mathématiques" (voir Youku de mofan pour plus de détails), et l'utilisation de print
return doit être ajouté sur une nouvelle ligne après la fonction.Je ne sais pas pourquoi, mais s'il n'y a pas d'addition, la formule de la fonction est comme un vase, comme un résultat qui ne peut pas être sorti. 2. La chose la plus déroutante est la logique. La logique n'était pas claire au début, ou il y avait des omissions dans le code, ce qui m'a amené à mettre gauche et droite dans le corps de la boucle. Le résultat est prévisible. Mais c'est aussi à cause de cette erreur que j'ai su comment utiliser le débogage dans pycharm. C'était assez simple et Baidu l'a trouvé instantanément. 3. Je ne sais pas pourquoi, mais la sortie d'impression de plusieurs variables dans la vidéo que j'ai regardée ne peut pas être utilisée dans mon pycharm, et le résultat est très étrange. C'est peut-être parce que je suis sur Win10 et non sur iOS. print Si plusieurs variables sont sorties ensemble, elles doivent être print("Name: %s, Name 2: %s" %(a, b)). > Question : 1. Pourquoi ajouter un retour ?
À propos des variables de données en python. Les résultats de la première exécution étaient évidemment erronés, j'ai donc utilisé le débogage. Il s'est avéré que mid1 était toujours égal à 1 au lieu de 1,5, nous avons donc commencé à comprendre les variables de données. Au début, j'ai deviné que toutes les variables en Python étaient de type entier par défaut, mais sur la base des résultats de la dichotomie, j'ai réalisé que cette supposition était fausse, il n'était donc pas nécessaire de changer le format des variables de l'ensemble du fichier. J'ai donc ajouté un flottant devant la formule mid1, et le résultat était affiché comme 1,5. Mais si j'entoure la formule entière avec () et que j'ajoute un float devant, le résultat est toujours 1. Je ne comprends pas très bien pourquoi. Cependant, je sais que le format des données de Python est déterminé en fonction du montant d'entrée, c'est-à-dire que si votre montant d'entrée est un entier, alors la sortie du calcul qui y est directement liée doit être un type entier, et c'est un entier. type qui n’utilise pas de transport. Avant d'utiliser les deux méthodes +float/+.0, mid1~3 étaient tous des nombres entiers.Méthode des points de grille - méthode de division égale en trois points
左极限=0.45,右极限=0.775,极小值x=0.6125rrree
import numpy as np def qwer(x): third = np.exp(x) - 5*x return third left = 1 right = 2 mid1 =float(left+right) / 2 mid2 = (left+mid1) / 2 mid3 = (mid1+right) /2 a = qwer(mid1) b = qwer(mid2) c = qwer(mid3) i = 5 while i > 0: i=i-1 if a > b: if c > b : #b right = mid1 mid1 = mid2 a=b mid2 = (left + mid1) / 2 mid3 = (mid1 + right) / 2 b = qwer(mid2) c = qwer(mid3) else:#b>c #c left = mid1 mid1 = mid3 a = c mid2 = (left + mid1) / 2 mid3 = (mid1 + right) / 2 b = qwer(mid2) c = qwer(mid3) else:#b>a if a > c: #C left = mid1 mid1 = mid3 a = c mid2 = (left + mid1) / 2 mid3 = (mid1 + right) / 2 b = qwer(mid2) c = qwer(mid3) else:#b>a&c>a # a left = mid2 right = mid3 mid2 = (left + mid1) / 2 mid3 = (mid1 + right) / 2 b = qwer(mid2) c = qwer(mid3) print("最小值=%s"%mid1) print("函数值=%s"%a)
Je veux vraiment me plaindre de l'impression, c'est tellement gênant que je dois obtenir un %s à chaque fois. . Et parfois, ils ne peuvent pas être assemblés ! ! ! !
Méthode de Fibonacci
最小值=1.609375 函数值=-3.047189552275773Ne me demandez pas ce que je maîtrise, demandez-moi à quel point j'aime la représentation précise de python après avoir écrit ce code :-) J'ai décidé d'écrire simplement des formules mathématiques dans le futur Le code ajoutera beaucoup de définition de fonction 0
Golden Section<.>
left = 1.0 right = 2.0 mid1 =(left+right) / 2
def fibonacci(n): i=0 a = 0 b = 1 for i in range(n): i=i+1 c = a+b a = b b = c return c def bn(x): ert = x**2 - 6*x + 2 return ert z = 2 p = 0 left = 0.00000 right = 10.00000 L1 = right - left while z < 100: m = fibonacci(z) l = L1/m k = 1.000/m if k < 0.03: print("n=%s,Fn=%s"%(z,m)) L2 = l*fibonacci(z-1) t = left + L2 r = right -L2 while p < 3: p = p + 1 l3 = t - r e= bn(t) o = bn(r) if e>o : right = t t = r r = left + l3 else:#o>e left = r r = t t = right - l3 break else: z = z + 1 okk=(left+right)/2 okky=bn(okk) print(left) print(right) print("极小值x=",okk) print("极小值y=",okky)
Cette formule semble très gênante, vous devriez donc être plus prudent lorsque vous l'écrivez. La dernière fois j'ai mis le 2 sous le point-virgule, et le résultat était très gros, il vaut donc mieux le convertir en 0,5 (PS : N'oubliez pas le long fleuve de 0).
Bien que le code soit très long, c'est principalement parce qu'il y a trop d'impressions. J'avais prévu de l'imprimer au début, mais à la fin la dernière partie a été manquée. Je suis trop paresseux pour penser à d'autres méthodes, alors faisons ceci Méthode indirecte - Méthode de Newtondef gold(x): gg= x**2 - 6*x + 9 return gg left = 1 right = 7 ans = 0.4 a = left + 0.618 * (right - left) b = left + 0.382*(right - left) gga = gold(a) ggb = gold(b) i = 0 while i < 7: print("i=%s" % i) print("left=%s,right=%s" % (left, right)) print("x左=%s,x右=%s" % (a, b)) print("y左=%s,y右=%s" % (ggb, gga)) c = right - left if c > 0.4: i = i + 1 if gga > ggb: right = a a = b b = left + 0.382*(right - left) gga = ggb ggb = gold(b) else:#gga<ggb left = b b = a a = left + 0.618 * (right - left) ggb = gga gga = gold(a) else: break
Il s'agit du premier ensemble de codes Python que j'ai implémenté moi-même, qui consiste à assembler des formules mathématiques en utilisant le langage Python. Quand j’ai commencé, je savais à peu près ce qui devait être reflété dans le langage, mais ce n’était pas clair. J'ai donc trouvé quelques dichotomies sur Internet. Elles sont toutes différentes, mais le cadre est similaire. Cependant, si nous voulons utiliser notre formule, nous devons beaucoup changer. Ensuite, j'ai commencé à analyser notre problème et j'ai découvert qu'il nécessite généralement deux parties, une partie de définition de fonction et une partie de corps de boucle. Mais je ne sais pas comment définir des fonctions, comment écrire des formules mathématiques, comment créer des variables, ce qui veut dire que je ne sais pas comment faire certaines petites choses, alors j'ai choisi d'aller directement sur Baidu. Parce que je sais que je suis un bon lecteur et que je sais mieux comprendre les points clés en lisant qu’en les extrayant d’une vidéo. Trouvez des points de connaissance utiles et ayez une compréhension plus ferme.
J'ai donc commencé à écrire le premier - la dichotomie. J’ai découvert que j’avais fait beaucoup d’erreurs et que beaucoup d’entre elles étaient très basiques. Mais je n'ai toujours pas choisi la vidéo. Au lieu de cela, j'ai cherché ces questions directement sur Baidu, car vous n'auriez peut-être pas trouvé l'essentiel après la vidéo. Bien entendu, il s’agit d’un processus étape par étape, il ne s’agit pas simplement de mettre en place le programme et de le modifier petit à petit.
Avec le succès des deux premiers, j'ai constaté que j'avais pris confiance dans ces codes, et semblais voir à travers leurs déguisements et en saisir l'essence. De plus, j'ai également réalisé que ma capacité d'apprentissage semble s'être beaucoup améliorée depuis août et que j'ai des méthodes d'apprentissage plus efficaces. Il y a eu un certain réveil dans tous les aspects. À l'exception du premier où j'ai trouvé quelques codes erronés, les autres ont tous été écrits selon ma propre logique, une fois que la logique était claire, si je ne savais pas comment traduire une certaine partie de la langue, j'y allais. à Baidu En fait, ces routines sont toutes les mêmes ou Les routines de transformation des formules mathématiques sont les mêmes.
J'ai également réalisé que l'assemblage est en fait le langage le plus difficile d'après ce que j'ai appris jusqu'à présent, car beaucoup d'entre eux doivent être définis par moi-même, ils doivent se souvenir de beaucoup d'instructions et ne peuvent pas être flexibles. Mais pour d’autres, il suffit d’écrire quelques correspondants. python est vraiment simple. De plus, j'ai découvert qu'aujourd'hui j'avais ouvert la porte à un nouveau monde. Je suis tombé amoureux de cette chose pleine de spiritualité, pleine de beauté rigoureuse, et j'ai découvert que j'avais l'impression de tomber amoureux. avec code. Cela ne se limite peut-être pas à python, ces langages regorgent de défis. Je pense qu'en cas de doute, il faut faire confiance à son intuition, au moins je l'ai trouvée assez précise
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!